【字符串】相关类型题目整理[二]

一、力扣58. 最后一个单词的长度

在这里插入图片描述

(一)找到最后一个单词统计其长度

思路:我们可以先找到最后一个单词,然后统计它的长度,需要注意的是我们需要把最后一个单词后面的空格去掉

代码如下:

class Solution 
{
public:
    int lengthOfLastWord(string s)
     {
        int count = 0;//统计最后一个单词的长度
        int n=s.length();
        int i=n-1;
        while(i>=0 && s[i] == ' ')//去掉最后一个单词后面的空格
        {
            i--;
        }
        while(i>=0 && s[i--]!=' ')//对最后一个单词长度进行统计
        {
            count++;
        }
        return count;//返回结果
    }
};

(二)对(一)进行优化

思路:从后往前遍历字符串,如果遇到不是空格的就对count加一,如果第一次遇到了空格并且count不等于0的时候说明最后一个单词已经遍历完了,直接结束循环。

代码如下:

class Solution 
{
public:
    int lengthOfLastWord(string s) 
    {
        int count=0;
        int n=s.length();
        for(int i=n-1;i>=0;i--)
        {
            if(s[i]!=' ')
            {
                count++;
            }
            if(s[i] == ' ' && count!=0)//当第一次进入这个条件语句时,说明最后一个单词的已经遍历完了
            {
                break;
            }
        }
        return count;//返回最后的结果
    }
};

二、力扣345. 反转字符串中的元音字母

在这里插入图片描述

(一)两次遍历字符串+栈

思路:利用栈的先进后出的特点,先从前往后遍历将元音字母放入栈中,然后第二次从前往后碰到元音字母时将栈中的元素将原来的元音字母覆盖掉。

  • 注意:大写字母和小写字母不一样,原因字母有十个

代码如下:

class Solution 
{
public:
    string reverseVowels(string s) 
    {
        
        stack<char> st;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='a' || s[i] == 'e' || s[i]=='i'||s[i]=='o' || s[i]=='u' ||
            s[i]=='A' || s[i] == 'E' || s[i]=='I'||s[i]=='O' || s[i]=='U')
            {
                st.push(s[i]);
            }
        }
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='a' || s[i] == 'e' || s[i]=='i'||s[i]=='o' || s[i]=='u' ||
            s[i]=='A' || s[i] == 'E' || s[i]=='I'||s[i]=='O' || s[i]=='U')
            {
                s[i]=st.top();
                st.pop();
            }
        }
        return s;
    }
};

(二)对(一)进行代码优化

由于(一)中if语句里面的||太多了,我们可以将这部分简化一下

代码如下:

class Solution
{
public:
    string reverseVowels(string s) 
    {
        string str="aeiouAEIOU";
        int n=s.size();
        stack<char> st;
        for(int i=0;i<n;i++)
        {
            if(str.find(s[i])!=-1)
            {
                st.push(s[i]);
            }
        }
        for(int i=0;i<n;i++)
        {
            if(str.find(s[i])!=-1)
            {
                s[i]=st.top();
                st.pop();
            }
        }
        return s;
    }
};

(三)双指针

思路:有一个指针从前往后遍历,一个指针从后往前遍历,如果两个指针都是元音字母,则将两个指针指向的字符进行交换即可

代码如下:

class Solution 
{
public:
    string reverseVowels(string s) 
    {
        string str="aeiouAEIOU";
        int n=s.size();
        int i=0,j=n-1;
        while(i<j)
        {
            while(i<j && str.find(s[i]) ==-1)
            {
                i++;
            }
            while(i<j && str.find(s[j]) == -1)
            {
                j--;
            }
            if(i<j)
            {
                swap(s[i],s[j]);
            } 
            i++;
            j--;
        }
        return s;
    }
};

三、力扣389. 找不同

在这里插入图片描述

(一)对两个字符串进行排序再一一对比

代码如下:

class Solution {
public:
    char findTheDifference(string s, string t) {
        sort(s.begin(),s.end());
        sort(t.begin(),t.end());
        for(int i=0,j=0;i<s.size(),j<t.size();i++,j++)
        {
            if(s[i]!= t[j])
            {
                return t[j];
            }
        }
        return ' ';
    }
};

(二)哈希表法

思路:先将两个字符串中出现的字符次数都存放在哈希表中,因为只有一个字符是被添加进去的,所以被添加进去的这个字符在两个字符串中出现的总次数一定是奇数

代码如下:

class Solution 
{
public:
    char findTheDifference(string s, string t) 
    {
        unordered_map<char,int> hash;
        for(int i=0;i<s.size();i++)
        {
            hash[s[i]]++;
        }
        for(int j=0;j<t.size();j++)
        {
            hash[t[j]]++;
        }
        for(auto& x:hash)
        {
            if(x.second%2==1)
            {
                return x.first;
            }
        }
        return ' ';
    }
};

(三)计数

思路:首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串 t,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 t 中出现的次数大于在字符串 s 中出现的次数,因此该字符为被添加的字符

vector写法:

class Solution 
{
public:
    char findTheDifference(string s, string t) 
    {
        vector<int> res(128,0);
        for(int i=0;i<s.size();i++)
        {
            res[s[i]]++;
        }
        for(int i=0;i<t.size();i++)
        {
            res[t[i]]--;
            if(res[t[i]]<0)
            {
                return t[i];
            }
        }
        return ' ';
    }
};

哈希表写法:

class Solution 
{
public:
    char findTheDifference(string s, string t) 
    {
        unordered_map<char,int> hash;
        for(int i=0;i<s.size();i++)
        {
            hash[s[i]]++;
        }
        for(int i=0;i<t.size();i++)
        {
            hash[t[i]]--;
            if(hash[t[i]]<0)
            {
                return t[i];
            }
        }
        return ' ';
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值