LeetCode Day7 字符串

本文介绍了三种字符串处理问题的解决方案,包括统计单词数、反转字符串和翻转字符串中的单词。对于统计单词数,通过判断字符与空格的关系实现;反转字符串采用双指针法;翻转单词则需要先整体翻转再逐个翻转单词,并处理多余空格。这些方法展示了字符串处理的基本思路和常见算法应用。
摘要由CSDN通过智能技术生成

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;
    }
};
### 回答1: 使用reverse函数反转leetcode字符串的方法是:将字符串作为参数传入reverse函数,然后将反转后的字符串返回给调用者。例如:let reversedString = reverse("leetcode")。 ### 回答2: 要使用reverse函数反转leetcode这个字符串,可以使用以下步骤: 1. 将字符串"leetcode"转换为字符数组。可以使用字符串的toCharArray()方法,该方法会返回一个字符数组,其中每个元素是字符串的一个字符。 2. 定义两个指针,left和right,分别指向字符数组的首尾。 3. 循环交换left和right指向的字符,然后将left指针向右移动一位,将right指针向左移动一位,直到left指针大于等于right指针。 4. 将反转后的字符数组转换回字符串。可以使用字符数组的valueOf()方法,该方法会将字符数组转换为一个新的字符串。 以下是用Java代码实现上述步骤的示例: ```java public String reverseString(String s) { // 将字符串转换为字符数组 char[] chars = s.toCharArray(); // 定义两个指针 int left = 0; int right = chars.length - 1; // 循环交换字符 while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } // 将字符数组转换为字符串 return String.valueOf(chars); } ``` 通过调用reverseString("leetcode")函数,将会返回字符串"edocteel",即将"leetcode"反转的结果。 ### 回答3: 要使用reverse函数来反转字符串"leetcode",只需将字符串转换为一个列表,然后使用reverse函数来翻转该列表,最后将列表转回字符串即可。 首先,将字符串"leetcode"转换为一个字符列表,可以使用list函数来实现,即list("leetcode"),得到列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']。 接下来,使用reverse函数来反转该列表,即reverse(['l', 'e', 'e', 't', 'c', 'o', 'd', 'e'])。 最后,将翻转后的列表转换回字符串,可以使用join函数将列表中的字符连接起来,即''.join(['e', 'd', 'o', 'c', 't', 'e', 'e', 'l'])。 所以,将字符列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']翻转并转换为字符串的过程为:''.join(reverse(list("leetcode"))),得到的结果为"edocteel",即字符串"leetcode"反转后的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值