string刷题lc

162 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情


387.字符串中的第一个唯一字符

思路

在这里插入图片描述

由于该字符串只包含小写字母,我们可以开一个大小只有26的空间用来储存每个字符出现的个数,即每个字符出现一次就加1。 最后一次遍历,第一个为1的就是我们要找的那个。

代码

class Solution {
public:
    int firstUniqChar(string s) {
        int arr[26]={0};
        for(auto ch:s)
        {
            arr[ch-'a']++;
        }
        //下面这种遍历也可以
        // for(int i=0;i<s.size();i++)
        // {
        //     arr[s[i]-'a']++;
        // }
        for(int i=0;i<s.size();i++)
        {
            if(arr[s[i]-'a']==1)
            return i;
        }
        return -1;
    }
};

HJ1字符串最后一个单词的长度

思路

首先我们读入一行字符,我们知道最后一个单词前面一定是空格。所以我们可以用rfind函数查找到最后一个单词前面的空格的位置。如何用字符串的长度减去该空格的位置就是单词的长度(注意要再减一个1)。

代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str;
    getline(cin,str);
    int pos=str.rfind(' ');
    cout<<str.size()-pos-1<<endl;
    return 0;
}

125.验证回文串

思路

对于字符串,因为有大小写的区别,所以首先可以先把大写转成小写(或者小写转成大写也可以),然后根据回文的形式进行判断就可以。 我们从字符的头和尾分别开始进行对比,遇见非字母数字则跳过。不是相同的字符就返回false。全部对比完之后,都没有发现不同的,则为回文串。

代码

class Solution {
public:
    bool isChar(char a)
    {
        return (a>='a'&&a<='z')||(a>='0'&&a<='9');
    }
    bool isPalindrome(string s) {
        for(auto& ch:s)
        {
            if(ch>='A'&&ch<='Z')
            ch=ch-'A'+'a';
        }
        int begin=0;
        int end=s.size()-1;
        while(begin<end)
        {
            while(begin<end && !isChar(s[begin]))
            ++begin;
            while(begin<end && !isChar(s[end]))
            --end;

            if(s[begin]!=s[end])
            return false;
            else
            {
                ++begin;
                --end;
            }
        }
        return true;
    }
};