字串中的第一個唯一字元 C++
阿新 • • 發佈:2019-02-16
給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。這個時候題目沒有要求是多少時間複雜度,並且字串中也只有小寫字母,暫時不考慮大寫字母;初步想法是兩次遍歷找到字串中重複的字元;然後動態申請一個與字串大小一樣的陣列;將出現重複的位置標1;最後尋找陣列中第一個0的位置就行;具體的程式碼如下:
但是因為這樣做的話時間複雜度為o(n^2);並且沒有辦法處理複雜的環境,比如說有大寫字母的時候,所以想到應用ASCII碼去做,會很方便;第一步先定義一個長度為256的0陣列(其實125應該也夠了);第二步遍歷字串,將每個字串中的字元對應的ACSII碼位置標1,如果出現相同的,則在原有位置加1;第三步還是遍歷字串,找到第一個字元對應的ASCII碼位置為1的字元,返回其位置;這樣時間複雜度為0(n),並且可以處理大寫字元;程式碼如下:#include<iostream> #include<string> #include<memory> using namespace std; class Solution { public: int firstUniqChar(string s) { int n = s.size(); char temp; unique_ptr<int[]> num(new int[n]());//用unique_ptr去建立動態陣列可以使用下標操作;在memory函式下; if (n<1) return -1; if (n == 1) return 0; for (int i = 0; i<n - 1; i++) { temp = s[i]; for (int j = i + 1; j<n; j++) { if (temp == s[j]) { num[i] = num[j] = 1; break; } continue; } } for (int i = 0; i<n; i++) { if (num[i] == 0) return i; } return -1; } };
#include <iostream> //利用ASCII碼錶; using namespace std; class Solution { public: int firstUniqChar(string s) { int p[256] = { 0 }; int n = s.size(); for (int i = 0; i < n; i++) { p[s[i]] += 1; } for (int j = 0; j < n; j++) { if (p[s[j]] == 1) { return j; } } return -1; } }; int main() { Solution temp; string s = "loveleetcode"; cout << temp.firstUniqChar(s) << endl; system("pause"); return 0; }