LeetCode Day7 字符串
程序员文章站
2024-02-24 15:01:25
...
434 字符串中的单词数
题目理解
统计字符串中的单词个数,单词指的是以空格为界限分开的字符。例如Hello, my name is John,单词分别为:Hello,、my、name、is、John 。
思路
当字符不等于空格时,说明当前字符构成单词,怎样判断当前单词结束呢,就是遇到空格时.因此计数器累加的条件就是当前字符不为空格,前一个字符为空格或是当前字符为首字符且不为空格,输出计数器结果即为所求。
代码
class Solution {
public:
int countSegments(string s) {
int count=0;
if(s.size())
{
if(s[0]!=' ') count=1;
for(auto i=s.begin();i!=s.end()-1;i++){
if(isspace(*i)&&!isspace(*(i+1)))
count++;
}
}
return count;
}
};
344 反转字符串
思路
可以使用双指针,L=0,R=n-1,交换L、R位置元素,L++,R–即可。
代码
class Solution {
public:
void reverseString(vector<char>& s) {
int n=s.size();
for(int c=0;c<n/2;c++)
{
char temp=s[c];
swap(s[c],s[n-1-c]);
}
}
};
151 翻转字符串里的单词
题目理解
区别于上一题,不是翻转每个字符,是将每个单词翻转。
单词的定义是:无空格的字符。
且有条件:翻转后的字符不能包括多余的空格,也就是两个单词间只能有一个空格且首尾无空格。
思路
①我的想法是首先可以先把字符全部翻转,这样只需再把每个单词进行翻转即可。首先要做的是把原字符串中多余的空格删掉。用start,end来记录当前单词的首尾,index表示消除多余空格的字符串索引。每次进行循环时,说明一个单词翻转完成,需要加空格分隔下一个单词。
②题解中还有一种思路是将每个单词存到双端队列中,或者直接用栈,再依次弹出即为每个单词翻转后的字符串。
代码
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(),s.end());
int index=0;
for(int start=0;start<s.size();start++){
if(s[start]!=' '){
if(index)
s[index++]=' ';
int end=start;
while(end<s.size()&&s[end]!=' ')
s[index++]=s[end++];
reverse(s.begin()+index-(end-start),s.begin()+index);
start=end;
}
}
s.erase(s.begin()+index,s.end());
return s;
}
};
双端队列
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(),s.end());
int index=0;
for(int start=0;start<s.size();start++){
if(s[start]!=' '){
if(index)
s[index++]=' ';
int end=start;
while(end<s.size()&&s[end]!=' ')
s[index++]=s[end++];
reverse(s.begin()+index-(end-start),s.begin()+index);
start=end;
}
}
s.erase(s.begin()+index,s.end());
return s;
}
};
387 字符串中的第一个唯一字符
思路
字符串中第一个不重复的字符,返回索引,可以使用哈希表,将出现的每个字符的次数存下来,次数为1的即为所求。
代码
class Solution {
public:
int firstUniqChar(string s) {
int count;
unordered_map<char,int> va;
for(auto c:s)
va[c]++;
for(int i=0;i<s.size();i++)
if(va[s[i]]==1)
return i;
return -1;
}
};
上一篇: day8学习总结
下一篇: # python day2(流程控制)