题解 | #第一个只出现一次的字符#
第一个只出现一次的字符
http://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c
题目:第一个只出现一次的字符
描述:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置,如果没有则返回-1(需要区分大小写).(从0开始计数)
示例1输入:"google",返回值:4
解题方法一:首先看到题目,第一反应是采用暴力法进行破解,设置两个指针i和j,循环条件为字符的位数。使下标i不变,j自增1,判断下标j所指的值,如果发现两个值相同的话,直接结束判断,令i自增1,依次循环进行判断,即可得到最终结果。
实例解析: 以这个"google"为例,如下表所示:
| g | o | o | g | l | e |
| i指针j指针 |
|
|
|
|
|
| 第一轮判断,i指针的值与j指针的值是否相等,以及i不等于j,不符合条件,j++ | |||||
| g | o | o | g | l | e |
| i |
| j |
|
|
|
| i |
|
| j |
|
|
| 相等的话,令i++,j从头开始 | |||||
| g | o | o | g | l | e |
| j | i |
|
|
|
|
|
| i,j |
|
|
|
|
|
| i | j |
|
|
|
| i不等于j,但是i对应的值与j对应的值相等,令i++,经过不断循环,最终得到最终结果值,最终值为下标位置为i的值 | |||||
参照C++代码如下所示:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int len = str.size();
if(len == 0)
return -1;
if(len == 1)
return 0;
for(int i = 0;i < len;i++){
int flag = 1;//没有重复的标志位
for(int j = 0;j < len;j++){
if(i != j && str[i] == str[j]){
flag = 0;
break;
}
}
if(flag == 1)
return i;
}
return -1;
}
}; 其时间复杂度为O(N2)。
解题方法二:C++中有若干库函数可以直接调用,比如find_first_of()函数:查找在字符串中第一个与str中的某个字符匹配的字符,返回它的位置。和find_last_of函数:在字符串中查找最后一个与str中的某个字符匹配的字符,返回它的位置。可以将两个方法结合起来,设置与操作即可满足最后的运算结果。
| g | o | o | g | l | e |
| 0 |
|
| 3 |
|
|
|
| 1 | 2 |
|
|
|
|
|
|
|
| 4 |
|
具体实现的C++代码为:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
if(str.length() == 0)
return -1;
for(int i = 0;i < str.length() - 1;i++){
if(str.find_last_of(str[i]) == i && str.find_first_of(str[i]) == i)//从前往后和从后往前找见的位置是否一样
return i;
}
return -1;
}
}; 其时间复杂度为O(N)。
在解决问题的同时,不断与人交流学习,通过牛客各式各样的题目,学习分享。
OPPO公司福利 1056人发布
