1.有效的字母异位词
class Solution { public: bool isAnagram(string s, string t) { //利用一个哈希表,存储26个字母,遍历s与t,一个加字母次数一个减字母次数,最后遍历哈希表,如果出现不为0的数字 //返回false int len1=s.length(); int len2=t.length(); if(len1!=len2) return false; int number[26]={0}; for(int i=0;i<len1;i++) { number[s[i]-'a']++; number[t[i]-'a']--; } for(int j=0;j<26;j++) { if(number[j]!=0) return false; } return true; } };
2. 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { //利用一个哈希表,key用来存储单词,value作为res的行号,每个key对应一个value vector<vector<string>> res; map<string,int> word; int sub=0;//value值 for(auto str:strs) { string cur=str; sort(cur.begin(),cur.end());//进行排序 if(word.count(cur)) { res[word[cur]].push_back(str);//如果存在相同的单词,就将原单词放入res中 } else { vector<string> s(1,str); res.push_back(s); word[cur]=sub++;//如果不存在,res新push一行s,然后word的value++,因为res的行号是word的value值 } } return res; } };
3.删除字符串中的所有相邻重复项
class Solution { public: string removeDuplicates(string S) { if(S.length()==0) return S; string res=""; stack<char> s1; s1.push(S[0]); for(int i=1;i<S.length();i++) { if(!s1.empty()&&S[i]==s1.top()) { s1.pop(); } else { s1.push(S[i]); } } while(!s1.empty()) { res+=s1.top(); s1.pop(); } reverse(res.begin(),res.end()); return res; } };
4.删除最外层的括号
class Solution { public: string removeOuterParentheses(string S) { //删除最外层的括号,利用一个堆栈,如果是左括号就放入栈,是右括号,就出栈一个左括号进行匹配。 //当栈非空时,res记录栈顶元素 string res = ""; stack<char> mystack; for (int i = 0; i < S.size(); i++) { if (S[i] == ')') mystack.pop(); if (!mystack.empty()) res+=S[i]; if (S[i] == '(') mystack.push('('); } return res; } };
5.柱状图中最大的矩形
class Solution { public: int largestRectangleArea(vector<int>& heights) { //利用单调栈的思想https://blog.csdn.net/Zolewit/article/details/88863970 heights.push_back(0);//最右面添加一个最小元素 stack<int> stk; int maxArea = 0; for(int i = 0;i<heights.size();i++) { while(!stk.empty() && heights[i]<heights[stk.top()]) { //如果出现小于栈顶元素的元素,就将栈顶元素出栈,此时的原栈顶元素右面第一个小于它的柱子下标是i //原栈顶元素左面第一个小于它的柱子下标是新栈顶元素 int top= stk.top(); stk.pop(); maxArea = max(maxArea,heights[top]*(stk.empty()? i:(i - stk.top() -1))); } stk.push(i); } return maxArea; } };
6.接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
class Solution { public: int trap(vector<int>& height) { int left = 0, right = height.size() - 1; int ans = 0; int left_max = 0, right_max = 0; while (left < right) { if (height[left] < height[right]) { height[left] >= left_max ? (left_max = height[left]) : ans += (left_max - height[left]); ++left; } else { height[right] >= right_max ? (right_max = height[right]) : ans += (right_max - height[right]); --right; } } return ans; } };