classSolution{public:intlengthOfLongestSubstring(string s){
unordered_set<char> us;int left =0, right =0;int out =0;while(right < s.size()){
us.emplace(s[right++]);
out =max(out, right - left);while(!us.empty()&& us.count(s[right]))
us.erase(s[left++]);}return out;}};
L5 最长回文子串
子串:连续的
回文
dp[i][j]表示i~j是不是回文
遍历次序先从字长1~N遍历!
classSolution{public:
string longestPalindrome(string s){int N = s.size();if(N <2)return s;
vector<vector<bool>>dp(N, vector<bool>(N,false));int start =0, len =0;for(int i =1; i <= N; i++){for(int j =0; j <= N - i; j++){int p = j + i -1;
dp[j][p]=(s[j]== s[p])&&(p - j <2|| dp[j+1][p-1]);if(dp[j][p]&& i > len){
start = j; len = i;}}}return s.substr(start, len);}};
L6 Z字形变换
按区间 0~2numRows-2变换(繁琐)
classSolution{public:
string convert(string s,int numRows){int N =2* numRows -2;int LEN = s.size();if(LEN <= numRows || numRows ==1)return s;int i =0;
string out[numRows];for(i =0; i < LEN; i += N){int j = i + N -1;for(int k = i; k <=min(j, LEN-1); k++){if(k <= i + numRows -1){
out[k-i].push_back(s[k]);}else{
out[N - k + i].push_back(s[k]);}}}
string res;for(int i =0; i < numRows; i++)
res += out[i];return res;}};
设一个标志位确定下行还是上行
classSolution{public:
string convert(string s,int numRows){int n = s.size();if(n <1|| numRows ==1)return s;
string out[min(n, numRows)];bool dir =false;int idx =0;for(auto& c : s){
out[idx]+= c;if(idx ==0|| idx == numRows -1)
dir =!dir;
idx += dir ?1:-1;}
string res ="";for(auto& ss : out)
res += ss;return res;}};
classSolution{public:intmyAtoi(string str){if(str.empty())return0;int idx =0, idx2 =0;for(idx =0; idx < str.size(); idx++){if(str[idx]!=' ')break;}if(idx == str.size())return0;int sgn =(str[idx]=='-')?-1:(isdigit(str[idx])|| str[idx]=='+')?1:-2;if(sgn ==-2)return0;for(idx2 = idx +1; idx2 < str.size(); idx2++){if(!isdigit(str[idx2]))break;}
string num = str.substr(idx, idx2 - idx);longlong x =0;int idx3 = idx;for(idx3 = idx; idx3 < idx2; idx3++)if(isdigit(str[idx3]))break;for(int i = idx3; i < idx2; i++){if(sgn * x *10> INT_MAX)return INT_MAX;elseif( sgn *x *10< INT_MIN)return INT_MIN;
x = x *10+ str[i]-'0';}
x *= sgn;if(x > INT_MAX)return INT_MAX;elseif( x < INT_MIN)return INT_MIN;elsereturn x;}};
确定有限状态机(deterministic finite automaton, DFA)
X
’ ’ 0
+/- 1
number 2
other 3
start 0
start
signed
in_number
end
signed 1
end
end
in_number
end
in_number 2
end
end
in_number
end
end 3
end
end
end
end
classSolution{private:classDFA{private:int state_move[4][4]{{0,1,2,3},{3,3,2,3},{3,3,2,3},{3,3,3,3}};int sgn =1;longlong num =0;int state =0;public:intget_move(char c){if(isspace(c))return0;elseif(c =='+'|| c =='-')return1;elseif(isdigit(c))return2;elsereturn3;}voidrun(char c){
state = state_move[state][get_move(c)];if(state ==1) sgn =(c =='-')?-1:1;elseif(state ==2){
num = num *10+ c -'0';if(sgn ==1) num =min(num,(longlong)INT_MAX);else num =min(num,-1*(longlong)INT_MIN);}}intget_num(){return num * sgn;}};public:intmyAtoi(string str){
DFA d;for(auto& c : str) d.run(c);return d.get_num();}};
L12 整数转罗马数字
输入一个整数,转换为罗马表示形式
贪心 + 列表 从大数表示
classSolution{private:
string L[13]{"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};int N[13]{1,4,5,9,10,40,50,90,100,400,500,900,1000};public:
string intToRoman(int num){if(num ==0)return"N";
string out ="";for(int i =12; i >=0; i--){int a = num / N[i];if(a ==0)continue;for(int j =0; j < a; j++)
out += L[i];
num = num % N[i];}return out;}};
L13 罗马数字转整数
13元素表方法
classSolution{private:
unordered_map<string,int> R {{"M",1000},{"CM",900},{"D",500},{"CD",400},{"C",100},{"XC",90},{"L",50},{"XL",40},{"X",10},{"IX",9},{"V",5},{"IV",4},{"I",1}};public:intromanToInt(string s){if(s.empty())return0;if(s.size()==1){if(R.count(s)==0)return0;elsereturn R[s];}int res =0;
s.push_back('N');for(int i =0; i < s.size()-1;){
string a = s.substr(i,1);
string b = s.substr(i,2);int na =0, nb =0;if(R.count(a)) na = R[a];if(R.count(b)) nb = R[b];if(na ==0&& nb ==0)return0;if(nb > na){res += nb; i+=2;}else{res += na; i++;}}return res;}};
7元素表方法
classSolution{private:
unordered_map<char,int> L {{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};intgetNum(char x){switch(x){case'I':return1;case'V':return5;case'X':return10;case'L':return50;case'C':return100;case'D':return500;case'M':return1000;default:return0;}}public:intromanToInt(string s){// // if (s.size() == 0) return 0;// // if (s.size() == 1) {// // if (L.count(s[0])) return L[s[0]];// // else return 0;// // }// int out = 0;// for (int i = 0; i < s.size() - 1; i++) {// char c = s[i], c2 = s[i + 1];// if (L.count(c) == 0 || L.count(c2) == 0) // return 0;// if (L[c] < L[c2]) out -= L[c];// else out += L[c];// }// out += L[s.back()];int out =0;for(int i =0; i < s.size()-1; i++){int n1 =getNum(s[i]), n2 =getNum(s[i +1]);if(n1 ==0&& n2 ==0)return0;if(n1 < n2) out -= n1;else out += n1;}
out +=getNum(s.back());return out;}};
L14 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”
classSolution{public:
string longestCommonPrefix(vector<string>& strs){if(strs.empty())return"";constauto p =minmax_element(strs.begin(), strs.end());for(int i =0; i < p.first->size();++i)if(p.first->at(i)!= p.second->at(i))return p.first->substr(0, i);return*p.first;}};
L38 外观数列
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1.
1
2.
11
3.
21
4.
1211
5.
111221
模拟
classSolution{public:
string countAndSay(int n){if(n <2)returnto_string(n);
string out ="1";while(n >1){int cnt =1;
string str ="";for(int i =0; i < out.size(); i++){char x = out[i];if(i +1< out.size()&& out[i +1]== out[i])
cnt++;else{
str +=to_string(cnt);
str.push_back(x);
cnt =1;}}
n--;
out = str;}return out;}};
L3 无重复字符的最长子串子串是连续的无重复使用无序set记录class Solution {public: int lengthOfLongestSubstring(string s) { unordered_set<char> us; int left = 0, right = 0; int out = 0; while (right < s.size()) { us.empla