持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}
};