力扣算法篇:字符串
1 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串""。
实例:
题解:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
//最长公共前缀
int len = strs.size();
//考虑空
if(len == 0){
return "";
}
//以最短的字符串为准
int min = 200;
int min_i = -1;
int m = 0;
for(int i = 0;i<len;i++){
m = strs[i].length();
if(m<min){
min = m;
min_i = i;
}
}
//如果长度不空 字符串为空
if(min == 0){
return "";
}
string sub;
//遍历
int count = 0;
//比较字符
for(int i = 0;i<min;i++){
count = 0;
for(int j = 0;j<len;j++){
//对应位置的字符是否相同
if(strs[j][i] == strs[min_i][i]){
count++;
}
}
if(i == 0){
if(count == len){
sub.push_back(strs[min_i][i]);
}else{
//第一个字符不都一样
return "";
}
}else{
if(count == len){
sub.push_back(strs[min_i][i]);
}else{
//不等了 退出循环 结束
break;
}
}
}
return sub;
}
};
2 翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
说明:
(1)无空格字符构成一个单词。
(2)输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
(3)如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
实例:
题解:分割字符串 翻转字符串 注意空格分割是空
class Solution {
public:
vector<string> split(const string &str, const string &pattern){
vector<string> res;
if(str == "")
return res;
//在字符串末尾也加入分隔符,方便截取最后一段
string strs = str + pattern;
size_t pos = strs.find(pattern);
while(pos != strs.npos)
{
string temp = strs.substr(0, pos);
res.push_back(temp);
//去掉已分割的字符串,在剩下的字符串中进行分割
strs = strs.substr(pos+1, strs.size());
pos = strs.find(pattern);
}
return res;
}
string reverseWords(string s) {
//翻转字符串里的单词
//单词的定义是无空格字符
//分割字符串
vector<string> substrs = split(s," ");
for(int i = 0;i<substrs.size();i++){
if(substrs[i].empty()){
vector<string>::iterator iter = substrs.begin()+(i);
//删除空字符串
substrs.erase(iter);
//删除之后回退一格
i--;
}
}
int n = substrs.size();
//掉转顺序
for(int i = 0;i<n/2;i++){
swap(substrs[i],substrs[n-1-i]);
}
string result = substrs[0];
//将字符串数组转变为字符串
for(int i = 1;i<n;i++){
//首部可能有空格 去掉
// substrs[i].erase(0,substrs[i].find_first_not_of(" "));
//添加上空格
result += " ";
result += substrs[i];
}
return result;
}
};