1.反转字符串中的每一个单词
Input:"hello world!"
Output:"world! hello"
思路:利用string流输入将原字符串按
空格分割,然后去除尾部空格,整体翻转字符串,最后遍历字符串进行部分翻转。
class Solution {
public:
string reverseWords(string s) {
stringstream ss(s);
string token, str;
// 利用string流输入将原字符串按空格分割
while (ss >> token) {
str = str + token + " ";
}
// 去除尾部空格
int sz = str.size() - 1;
while (str[sz] == ' ') {
str.pop_back();
sz--;
}
// 先整体翻转
reverse(str.begin(), str.end());
for (int i = 0, j = 0; i <= str.size(); ++i){
// 部分翻转
if (i == str.size() || str[i] == ' '){
reverse(str.begin()+j, str.begin()+i);
j = i + 1;
}
}
return str;
}
};
2.多个字符串的公共最长前缀
Input:["dog","rececar","car"]
output:""
Input:["flower","flow","flight"]
output:"fl"
思路:假设第一个字符串为最长前缀,比较当前最长前缀和下一个字符串的公共部分,不断更新公共前缀。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string res = "";
if (!strs.empty()){
// 假设第一个为最长前缀,以后再不断更新公共前缀
res = strs[0];
for (int i = 1; i < strs.size(); ++i){
// 比较当前最长前缀和下一个字符串的公共部分
int len = 0;
for (int j = 0; j < res.size() && j < strs[i].size(); ++j){
if (strs[i][j] == res[j])
len++;
else
break;
}
// 更新最长公共前缀
res = res.substr(0, len);
}
}
return res;
}
};
3.字符串转整数
Input:"42"
Output:42
思路:先过滤前面的空格,然后判断正负号以及首字符是不是数字,最后判断越界。
class Solution {
public:
int myAtoi(string str) {
int i = 0, flag = 1;
// 过滤前面的空格
while (str[i] == ' ')
i++;
// 判断正负号以及首字符是不是数字
if (str[i] == '-'){
i++;
flag = -1;
}
else if (str[i] == '+'){
i++;
}
else if (!isdigit(str[i]))
return 0;
long long int res = 0;
for (; i < str.size(); ++i){
if (isdigit(str[i])){
res = res * 10 + (str[i] - '0');
// 判断整数越界
if (res > INT_MAX && flag == 1)
return INT_MAX;
if (res > INT_MAX && flag == -1)
return INT_MIN;
}
else
break;
}
return res * flag;
}
};
4.N位字符串删除K个数字,使剩下的数字串最小
5.回文子串的个数
6.最长无重复字符的子串
7.最长回文子串
8.查找子串的位置