只出现一次的字符
问题描述:
给你一个只包含小写字母的字符串;
请你判断是否存在只在字符串中出现过一次的字符;
如果存在,则输出满足条件的字符中位置最靠前的那个;
如果没有, 输出 no.
输入格式:
共一行, 包含一个由小写字母构成的字符串;
数据保证字符串的长度不超过 100000.
输出格式:
输出满足条件的第一个字符;
如果没有, 则输出 no.
思路分析
-
思路一
首先, 使用哈希表, 将每一个字符都存到哈希表中,
其次, 对哈希进行循环判断, 只要有第一个哈希值为1的, 直接返回该字符. 遍历到最后没有值为1的, 即返回 ‘no’ .
-
思路二
使用哈希和双指针, 双指针都指向首个字符串, 每存放一个字符, 对第一个指针对应的哈希值进行判断, 如果大于1, 这时说明存放进去的字符有重复, 此时对第二个指针指向的字符(即第一个字符)进行哈希值判断, 如果等于1, 那么说明此字符不是重复的字符, 直接continue, 让第二个指针不变.
如果第二指针对应的哈希值大于1, 进行while循环, 即寻找哈希值为1对应的字符, 如果没有那么返回一个标志, 该标志对应输出’no’; 该循环内, 只要第二指针对应的哈希值不等于1, 那么指针后移, 直到遍历结束.
继续进行字符串的一位一位存放, 依次进行判断
代码实现
// 思路一代码实现
using namespace std;
int main()
{
int flag = 0;
string str;
getline(cin,str);
unordered_map<char, int> hash;
int i = 0, j = 0;
for(i=0, j=0; j<str.size(); j++)
{
hash[str[j]]++;
}
for(i=0; i<str.size(); i++)
{
if(hash[str[i]] == 1)
{
flag = 0;
break;
}
flag =1;
}
if(flag == 0)
{
cout << str[i] <<endl;
}
else
{
cout << "no" << endl;
}
}
// 思路二代码实现
using namespace std;
int main()
{
string str;
getline(cin,str);
unordered_map<char, int>hash;
int i = 0, j = 0, flag =0;
for(i=0, j=0; i<str.size(); i++)
{
hash[str[i]]++;
if(hash[str[i]] > 1)
{
if(hash[str[j]] == 1)
{
continue;
}
else
{
while(hash[str[j]] != 1 && j < i)
{
j++;
flag =0;
if(str[j] == str[i])
{
flag = 1;
}
}
}
}
}
if(flag == 0)
{
cout << str[j] <<endl;
}
else
{
cout << "no" << endl;
}
}