欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
    }
};
相关标签: leetcode c++