第一个只出现一次的字符位置
题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
使用哈希表来进行存储, 由于不能使用哈希表进行遍历, 所以还是用源字符串进行遍历
刚开始不理解为什么时间复杂度是O(n), 现在明白了, 第一个for是O(n), 第二个for也是O(n), 两个大O相加后时间复杂度是O(n), 下面是两个大O相乘
class Solution {
public:
int FirstNotRepeatingChar(string str) {
const int tableSize = 256;
vector<int> vt;
vt.resize(tableSize);
for (int i = 0; i < str.length(); i++) {
vt[str[i]]++;
}
for (int i = 0; i < str.length(); i++) {
if (1 == vt[str[i]]) {
return i;
}
}
return -1;
}
};
使用stl库中的map, map内部使用红黑树, 因此不能使用map进行遍历, 还需要用源字符串进行遍历, 话说是字符串中出现的位置, 好像就要用源字符串进行遍历
class Solution {
public:
int FirstNotRepeatingChar(string str) {
map<char, int> my_map;
for (auto i = 0; i < str.length(); i++){
my_map[str[i]]++;
}
for (auto i = 0; i < str.length(); i++) {
if (1 == my_map[str[i]]) {
return i;
}
}
return -1;
}
};
暴力方法, 没什么技术含量
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int position = 0;
while (position < str.length()) {
for (int i = 0; i < str.length(); i++) {
if (i == position)
continue;
if (str[position] == str[i])
break;
if (i == str.length() - 1)
return position;
}
position++;
}
return -1;
}
};