1. 程式人生 > 實用技巧 >1544. Make The String Great

1544. Make The String Great

Given a stringsof lower and upper case English letters.

A good string is a string which doesn't havetwo adjacent characterss[i]ands[i + 1]where:

  • 0 <= i <= s.length - 2
  • s[i]is a lower-case letter ands[i + 1]is the same letter but in upper-caseorvice-versa.

To make the string good, you can choosetwo adjacentcharacters that make the string bad and remove them. You can keep doing this until the string becomes good.

Returnthe stringafter making it good. The answer is guaranteed to be unique under the given constraints.

Noticethat an empty string is also good.

Example 1:

Input: s = "leEeetcode"
Output: "leetcode"
Explanation: In the first step, either you choose i = 1 or i = 2, both will result "leEeetcode" to be reduced to "leetcode".

Example 2:

Input: s = "abBAcC"
Output: ""
Explanation: We have many possible scenarios, and all lead to the same answer. For example:
"abBAcC" --> "aAcC" --> "cC" --> ""
"abBAcC" --> "abBA" --> "aA" --> ""

Example 3:

Input: s = "s"
Output: "s"

Constraints:

  • 1 <= s.length <= 100
  • scontains only lower and upper case English letters.
class Solution {
    public String makeGood(String s) {
        char[] ch = s.toCharArray();
        while(true) {
            boolean haspal = false;
            for(int i = 0; i < ch.length - 1; i++) {
                int j = i + 1;
                while(j < ch.length && ch[j] == '#') j++;
                if(j < ch.length && ch[j] != ch[i] && Character.toLowerCase(ch[i]) == Character.toLowerCase(ch[j])) {
                    ch[i] = '#';
                    ch[j] = '#';
                    haspal = true;
                }
            }
            if(!haspal) break;
        }
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < ch.length; i++) {
            if(ch[i] != '#') sb.append(ch[i]);
        }
        return sb.toString();
    }
}
class Solution {
    public String makeGood(String s) {
        Stack<Character> stack = new Stack();
        for(int i=0;i<s.length();i++){
            if(!stack.isEmpty() && Math.abs(stack.peek()-s.charAt(i)) == 32)
                stack.pop();
            else
                stack.push(s.charAt(i));
        }
        char res[] = new char[stack.size()];
        int index = stack.size()-1;
        while(!stack.isEmpty()){
            res[index--] = stack.pop();
        }
        return new String(res);
    }
}

用stack似乎更牛逼一些。stack好像是解決palindrome的標配啊