##字符串练习##
151. 翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
class Solution {
public:
string reverseWords(string s) {
string res;
string temp;
if(s[0]!=' ')
temp.push_back(s[0]);
for(int i=1;i<s.length();i++){
if(s[i]==' ' && s[i-1]==' ')
continue;
else if(s[i]==' '){
if(!res.empty())
res = temp +' ' + res;
else
res = temp;
temp = "";
}else{
temp.push_back(s[i]);
}
}
if(!temp.empty() && res.empty())
res = temp;
else if(!temp.empty())
res = temp +' ' + res;
return res;
}
};
高赞题解
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());
int size = (int)s.size();
int start = 0; //单词开始
int end = 0; //单词末尾
int index = 0;
for (; start < size; start++) {
if (s[start] == ' ') continue;
if (index != 0){
//第二个单词开始 开头需要插一个空格 并且使得index指向单词的开始
s[index++] = ' ';
}
end = start;
//替换原来的s 一直到空格为止
while (end < size && s[end] != ' ') {
s[index++] = s[end++];
}
//index指向了单词末尾的 下一个字符
//一个单词的长度
int len = end - start;
//index - len就是单词开始的地方
//s.begin() + index - len 单词开始的位置
//s.begin() + index 单词结束的位置
reverse(s.begin() + index - len, s.begin() + index);
//更新下一个单词的开始位置 start正好指向了空格的位置
start = end;
//这一轮循环结束 之后 start++
//如果只有一个空格 start正好 指向了下一个单词的开始位置
//如果有多个空格,则指向了下一个空格 下次循环开头会跳过
}
//去除末尾的空格和没有用的字符
s.erase(s.begin() + index, s.end());
return s;
}
};
557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
class Solution {
public:
string reverseWords(string s) {
int size=s.size();
int start=0;
int end=0;
int index = 0;
for(;start<size;start++){
if(index!=0)
s[index++]=' ';
end=start;
while(end<size && s[end]!=' ')
s[index++]=s[end++];
int len=end-start;
reverse(s.begin()+index-len,s.begin()+index);
start=end;
}
return s;
}
};
58. 最后一个单词的长度
给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。
示例:
输入: “Hello World”
输出: 5
class Solution {
public:
int lengthOfLastWord(string s) {
int res=0;
int isfirst=false;
for(int i=s.size()-1;i>=0;i--){
if(s[i]==' '){
if(isfirst)
break;
continue;
}
res++;
isfirst=true;
}
return res;
}
};
709. 转换成小写字母
实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。
示例 1:
输入: “Hello”
输出: “hello”
示例 2:输入: “here”
输出: “here”
示例 3:输入: “LOVELY”
输出: “lovely”。
class Solution {
public:
string toLowerCase(string str) {
for(int i=0;i<str.size();i++){
if(str[i]>='A' && str[i]<='Z')
str[i]=str[i]+32;
}
return str;
}
};
521. 最长特殊序列 Ⅰ
给你两个字符串,请你从这两个字符串中找出最长的特殊序列。
「最长特殊序列」定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。
子序列 可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。
输入为两个字符串,输出最长特殊序列的长度。如果不存在,则返回 -1。
示例 1:
输入: “aba”, “cdc”
输出: 3
解释: 最长特殊序列可为 “aba” (或 “cdc”),两者均为自身的子序列且不是对方的子序列。
示例 2:输入:a = “aaa”, b = “bbb”
输出:3
示例 3:输入:a = “aaa”, b = “aaa”
输出:-1提示:
两个字符串长度均处于区间 [1 - 100] 。
字符串中的字符仅含有 ‘a’~‘z’ 。
class Solution {
public:
int findLUSlength(string a, string b) {
return a==b?-1:max(a.size(),b.size());
}
};
415. 字符串相加
415. 字符串相加
难度简单184
给定两个字符串形式的非负整数
num1
和num2
,计算它们的和。注意:
num1
和num2
的长度都小于 5100.num1
和num2
都只包含数字0-9
.num1
和num2
都不包含任何前导零。- 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
模拟
模拟计算机求解过程
class Solution {
public:
string addStrings(string num1, string num2) {
string res;
int i=num1.size()-1;
int j=num2.size()-1;
int carry=0;
while(i>=0 || j>=0){
int n1=i>=0?num1[i]-'0':0;
int n2=j>=0?num2[j]-'0':0;
int temp=n1+n2+carry;
carry=temp/10;
res.push_back(temp%10+'0');
i--;
j--;
}
if(carry==1)
res.push_back(1+'0');
reverse(res.begin(),res.end());
return res;
}
};
1