剑指 Offer II 017. 含有所有字符的最短字符串
两个map,循环记录当前s区间满足字符的个数,当个数等于t的长度时更新答案
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char,int>hs,ht;
for(auto p:t) ht[p]++;
int l=0,r=0,cnt=0;
string ans;
for(;r<s.size();r++){
hs[s[r]]++;
if(hs[s[r]]<=ht[s[r]]) cnt++;
while(hs[s[l]]>ht[s[l]]){
hs[s[l]]--;
l++;
}
if(cnt==t.size()){
if(ans.empty()||r-l+1<ans.size()){
ans=s.substr(l,r-l+1);
}
}
}
return ans;
}
};
剑指 Offer II 018. 有效的回文
将字符串大写全部转化成小写,然后忽略其他字符,左右往中间推即可
class Solution {
public:
bool isPalindrome(string s) {
if(s.size()==0) return true;
int i=0;
int j=s.size()-1;
transform(s.begin(), s.end(), s.begin(), ::toupper);
while(i<j){
while(i<s.size()&&(s[i]<'a'||s[i]>'z')&&(s[i]<'A'||s[i]>'Z')&&(s[i]<'0'||s[i]>'9'))
i++;
while(j>=0&&(s[j]<'a'||s[j]>'z')&&(s[j]<'A'||s[j]>'Z')&&(s[j]<'0'||s[j]>'9'))
j--;
if(i>=j) break;
if(s[i]!=s[j]) return false;
i++;j--;
}
return true;
}
};
剑指 Offer II 019. 最多删除一个字符得到回文
只能删除一个字符,因此当判断回文出现一个不匹配时,分两种情况继续匹配即可
class Solution {
public:
bool validPalindrome(string s) {
int i=0;
int j=s.size()-1;
while(i<j&&s[i]==s[j]){
i++;
j--;
}
if(i>=j) return true;
int k=i+1;
int l=j;
while(k<l&&s[k]==s[l]){
k++;
l--;
}
if(k>=l) return true;
k=i;
l=j-1;
while(k<l&&s[k]==s[l]){
k++;
l--;
}
if(k>=l) return true;
return false;
}
};
剑指 Offer II 020. 回文子字符串的个数
对每一个字符左右遍历,好像很多人都没有用O(n)的马拉车,我的O(n*n)内存和时间都在90%以上
class Solution {
public:
int countSubstrings(string s) {
int ans=0;
for(int i=0;i<s.size();i++){
int j=i;
int k=i;
while(j>=0&&k<s.size()&&s[j]==s[k]){
ans++;
j--;
k++;
}
j=i;
k=i+1;
while(j>=0&&k<s.size()&&s[j]==s[k]){
ans++;
j--;
k++;
}
}
return ans;
}
};