給定一個字符串,找到第一個只出現一次的字符的下標(從 0 開始)。若不存在,返回 -1。字符串長度範圍 1~10000。
對於當前字符 str[i],分別向後與向前掃描:
j = i+1 到末尾),若發現相同字符,說明非唯一,跳出。k = i-1 到開頭),若發現相同字符,說明非唯一,跳出。j == n)且向前掃描到開頭(k < 0),則 str[i] 為第一個唯一字符,返回 i。#include <iostream>
#include <string>
using namespace std;
int FirstNotRepeatingChar(string str) {
int n = str.length();
if (n < 1 || n > 10000) return -1;
for (int i = 0; i < n; ++i) {
int j, k;
// 向後查找
for (j = i + 1; j < n; ++j) {
if (str[i] == str[j]) break;
}
// 向前查找
for (k = i - 1; k >= 0; --k) {
if (str[i] == str[k]) break;
}
// 判斷是否唯一
if (j == n && k < 0) {
return i;
}
}
return -1;
}
int main() {
string s = "aabccdbd";
cout << FirstNotRepeatingChar(s) << endl; // 輸出: 2 (字符 'b')
return 0;
}
上述雙層循環時間複雜度為 O(n²)。更優解法:
// 優化版
int FirstNotRepeatingCharOptimized(string str) {
int count[256] = {0};
for (char c : str) count[c]++;
for (int i = 0; i < str.size(); ++i)
if (count[str[i]] == 1) return i;
return -1;
}