Welcome to Subscribe On Youtube

3039. Apply Operations to Make String Empty

Description

You are given a string s.

Consider performing the following operation until s becomes empty:

  • For every alphabet character from 'a' to 'z', remove the first occurrence of that character in s (if it exists).

For example, let initially s = "aabcbbca". We do the following operations:

  • Remove the underlined characters s = "aabcbbca". The resulting string is s = "abbca".
  • Remove the underlined characters s = "abbca". The resulting string is s = "ba".
  • Remove the underlined characters s = "ba". The resulting string is s = "".

Return the value of the string s right before applying the last operation. In the example above, answer is "ba".

 

Example 1:

Input: s = "aabcbbca"
Output: "ba"
Explanation: Explained in the statement.

Example 2:

Input: s = "abcd"
Output: "abcd"
Explanation: We do the following operation:
- Remove the underlined characters s = "abcd". The resulting string is s = "".
The string just before the last operation is "abcd".

 

Constraints:

  • 1 <= s.length <= 5 * 105
  • s consists only of lowercase English letters.

Solutions

Solution 1

  • class Solution {
        public String lastNonEmptyString(String s) {
            int[] cnt = new int[26];
            int[] last = new int[26];
            int n = s.length();
            int mx = 0;
            for (int i = 0; i < n; ++i) {
                int c = s.charAt(i) - 'a';
                mx = Math.max(mx, ++cnt[c]);
                last[c] = i;
            }
            StringBuilder ans = new StringBuilder();
            for (int i = 0; i < n; ++i) {
                int c = s.charAt(i) - 'a';
                if (cnt[c] == mx && last[c] == i) {
                    ans.append(s.charAt(i));
                }
            }
            return ans.toString();
        }
    }
    
  • class Solution {
    public:
        string lastNonEmptyString(string s) {
            int cnt[26]{};
            int last[26]{};
            int n = s.size();
            int mx = 0;
            for (int i = 0; i < n; ++i) {
                int c = s[i] - 'a';
                mx = max(mx, ++cnt[c]);
                last[c] = i;
            }
            string ans;
            for (int i = 0; i < n; ++i) {
                int c = s[i] - 'a';
                if (cnt[c] == mx && last[c] == i) {
                    ans.push_back(s[i]);
                }
            }
            return ans;
        }
    };
    
  • class Solution:
        def lastNonEmptyString(self, s: str) -> str:
            cnt = Counter(s)
            mx = cnt.most_common(1)[0][1]
            last = {c: i for i, c in enumerate(s)}
            return "".join(c for i, c in enumerate(s) if cnt[c] == mx and last[c] == i)
    
    
  • func lastNonEmptyString(s string) string {
    	cnt := [26]int{}
    	last := [26]int{}
    	mx := 0
    	for i, c := range s {
    		c -= 'a'
    		cnt[c]++
    		last[c] = i
    		mx = max(mx, cnt[c])
    	}
    	ans := []rune{}
    	for i, c := range s {
    		if cnt[c-'a'] == mx && last[c-'a'] == i {
    			ans = append(ans, c)
    		}
    	}
    	return string(ans)
    }
    
  • function lastNonEmptyString(s: string): string {
        const cnt: number[] = Array(26).fill(0);
        const last: number[] = Array(26).fill(0);
        const n = s.length;
        let mx = 0;
        for (let i = 0; i < n; ++i) {
            const c = s.charCodeAt(i) - 97;
            mx = Math.max(mx, ++cnt[c]);
            last[c] = i;
        }
        const ans: string[] = [];
        for (let i = 0; i < n; ++i) {
            const c = s.charCodeAt(i) - 97;
            if (cnt[c] === mx && last[c] === i) {
                ans.push(String.fromCharCode(c + 97));
            }
        }
        return ans.join('');
    }
    
    

All Problems

All Solutions