做不受欢迎人士的时间比较久,看到有私信下意识以为要挨骂,乐
BGM:思念一个荒废的名字(陈楚生《瘾》)
Descripition
Given a string s of lower and upper case English letters.
A good string is a string which doesn’t have two adjacent characters s[i] and s[i + 1] where:
0 <= i <= s.length - 2
s[i] is a lower-case letter and s[i + 1] is the same letter but in upper-case or vice-versa.
To make the string good, you can choose two adjacent characters that make the string bad and remove them. You can keep doing this until the string becomes good.
Return the string after making it good. The answer is guaranteed to be unique under the given constraints.
Notice that an empty string is also good.
Example
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
Constraints:
1 <= s.length <= 100
s contains only lower and upper case English letters.
Solution
Problem:
1.Be careful about making sure that the stack is NOT empty
2.When use for-loop to visit the elements in a empty string s, be careful about the length of s is zero. This time please use s.push_back(element)
instead of for-loop in s.length()
Code
class Solution {
public:string makeGood(string s){stack<char>ori;ori.push(s[0]);for(int i=1;i<s.length();++i){if(!ori.empty()){char mid=ori.top();if((mid>=65&&mid<=90)&&s[i]==mid+32) ori.pop();else if((mid>=97&&mid<=122)&&s[i]==mid-32) ori.pop();else ori.push(s[i]);}else ori.push(s[i]);}if(!ori.empty()){string c;int cnt=0;while(!ori.empty()){c.push_back(ori.top());ori.pop();}reverse(c.begin(),c.end());return c;}else return "";}
};