题解 | #找出字符串中第一个只出现一次的字符#
找出字符串中第一个只出现一次的字符
http://www.nowcoder.com/practice/e896d0f82f1246a3aa7b232ce38029d4
题意
给n个字符,求其中首个只出现一次的字符是什么
限制,n不大于1000
方法
朴素实现
注意到n很小,我们遍历字符串,对于每一个位置再次遍历字符串,检查是否出现过,注意双重for循环时坐标相等需要跳过
以样例字符串 asdfasdfo 为例
- | a | s | d | f | a | s | d | f | o |
---|---|---|---|---|---|---|---|---|---|
a | - | 不存在相等 | 不存在相等 | 不存在相等 | 存在相等 | - | - | - | - |
s | 不存在相等 | - | 不存在相等 | 不存在相等 | 不存在相等 | 存在相等 | - | - | - |
d | 不存在相等 | 不存在相等 | - | 不存在相等 | 不存在相等 | 不存在相等 | 存在相等 | - | - |
f | 不存在相等 | 不存在相等 | 不存在相等 | - | 不存在相等 | 不存在相等 | 不存在相等 | 存在相等 | - |
a | 存在相等 | - | - | - | - | - | - | - | - |
s | 不存在相等 | 存在相等 | - | - | - | - | - | - | - |
d | 不存在相等 | 不存在相等 | 存在相等 | - | - | - | - | - | - |
f | 不存在相等 | 不存在相等 | 不存在相等 | 存在相等 | - | - | - | - | - |
o | 不存在相等 | 不存在相等 | 不存在相等 | 不存在相等 | 不存在相等 | 不存在相等 | 不存在相等 | 不存在相等 | - |
找到字符o
代码
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i = (a);i<(b);i++)
using namespace std;
int main(){
char s[1010];
while(~scanf("%s",s)){
int n = strlen(s);
int idx = -1;
rep(i,0,n){ // 遍历字符串
bool exist = false;
rep(j,0,n){ // 找是否出现过
if(i == j)continue;
if(s[i] == s[j]){ // 出现过
exist = true;
}
}
if(!exist){ // 未出现过
idx = i; // 记录坐标
break;
}
}
if(idx == -1){
printf("-1\n");
continue;
}
printf("%c\n",s[idx]); // 输出字符
}
return 0;
}
复杂度分析
时间复杂度: 最坏情况,两层for都是字符串长度,所以时间复杂度为
空间复杂度: 主要是字符串本身储存,为
扫两遍
代码
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i = (a);i<(b);i++)
using namespace std;
int main(){
char s[1010];
while(~scanf("%s",s)){
map<char,int> cnt; // 字符出现计数
int n = strlen(s);
rep(i,0,n){
cnt[s[i]]++; // 计数+1
}
int idx = -1;
rep(i,0,n){
if(cnt[s[i]] == 1){ // 只出现一次
idx = i;
break;
}
}
if(idx == -1){
printf("-1\n");
continue;
}
printf("%c\n",s[idx]); // 输出字符
}
return 0;
}
复杂度分析
时间复杂度: 对字符串扫了两遍,每次查询最差, 所以时间复杂度为
空间复杂度: 主要是字符串储存和统计储存,所以空间复杂度为