算法题解整理之字符串处理专题
38. 外观数列
【题目描述】:给定一个正整数 n ,输出外观数列的第 n 项。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:
【C++代码】:
class Solution {
public:
string countAndSay(int n) {
string s = "1";
for (int i = 0; i < n - 1; i++) {
string ns;
for (int j = 0; j < s.size(); j++) {
int k = j;
while (k < s.size() && s[k] == s[j])k++;
ns += to_string(k - j) + s[j];
j = k - 1;
}
s = ns;
}
return s;
}
};
49. 字母异位词分组
【题目描述】:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
【C++代码】:
class Solution {
public:
vector<vector<string>>groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> hash;
for (auto str : strs) {
string key = str;
sort(key.begin(), key.end());
hash[key].push_back(str);
}
vector<vector<string>> res;
for (auto item : hash)res.push_back(item.second);
return res;
}
};
151. 翻转字符串里的单词
【题目描述】:给定一个字符串,逐个翻转字符串中的每个单词。说明:无空格字符构成一个 单词 。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
【分析】:
【C++代码】:
class Solution {
public:
string reverseWords(string s) {
int k = 0;
for(int i = 0;i < s.size();i++){
while(i < s.size()&& s[i] == ' ') i++;
if(i == s.size()) break;
int j = i;
while(j < s.size() && s[j]!= ' ')j++;
reverse(s.begin()+i,s.begin() + j);
if(k) s[k++] = ' ';
while(i < j) s[k++] = s[i++];
}
s.erase(s.begin() + k,s.end());
reverse(s.begin(),s.end());
return s;
}
};