題目描述:
給定一個只包含小寫字母的字符串,請你找到第一個僅出現一次的字符。如果沒有,輸出"no"
。
輸入格式
一個字符串,長度小於 100000100000。
輸出格式
輸出第一個僅出現一次的字符,若沒有則輸出"no"
。
解題思路:
有兩種思路,第一種直接使用兩層for循環遍歷字符串,然後輸出第一個只出現一次的字符,然後結束程序,時間複雜度O(n^2)。第二種方法是先循環遍歷一遍字符串,使用一個數組存儲所有字符出現的次數,然後再進行一次循環找到第一個只出現一次的字符,然後輸出並終止程序。時間複雜度O(n)。
方法1:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
getline(cin,s);
int n,len = 0;
len = s.size();
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
//abcabd
if(s[i]==s[j]&&i!=j){
//cout<<s[i];
break;
}
if(j==s.size()-1){
cout<<s[i];
return 0;
}
}
}
cout<<"no";
return 0;
}
方法2:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
int letters[26] = {0}; //使用一個數組來存儲26個字母出現的次數
int len = 0; //存儲s的長度
getline(cin, s);
len = s.length();
//首先循環一次s,統計所有字母出現的次數
for(int i=0;i<len;i++){
letters[s[i]-'a']++; //'a'的ASCII碼爲97
}
//在循環遍歷統計結果,出現第一個出現一次的字符就輸出,並終止
for(int i=0;i<len;i++){
if(letters[s[i]-'a']==1){
cout<<s[i];
return 0;
}
}
//如果沒有則輸出no
cout<<"no";
return 0;
}