1. 程式人生 > >字串中的第一個唯一字元 C++演算法 leetcode387

字串中的第一個唯一字元 C++演算法 leetcode387

題目:字串中的第一個唯一字元

給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。

案例:

s = "leetcode"
返回 0.

s = "loveleetcode",
返回 2.

注意事項:您可以假定該字串只包含小寫字母。

解答:

用雜湊表建立每個字元和其出現次數的對映,然後按順序遍歷字串,找到第一個出現次數為1的字元,返回其位置即可。

程式碼示例:

1.封裝類

class Solution 
{
public:
    int firstUniqChar(string s) 
    {
        unordered_map<char, int> m;
        for (char c : s) 
            m[c]++;
        for (int i = 0; i < s.size(); ++i) 
        {
            if (m[s[i]] == 1) 
                return i;
        }
        return -1;
    }
};

分析:unordered_map<char, int>  m;

這行程式碼建立一個容器,內部資料結構為雜湊表

for (char c : s)

定義一個遍歷字元c,讓它分別等於字串陣列s裡面的各個字元,然後執行下面的語句.當c被賦值為chars裡面所有字元各一次後,就會退出這個迴圈

m[c]++;計算雜湊表裡出現相同字母的次數

之後的for()迴圈,判斷第一次出現唯一出現的字母,若有返回i值(字母所處位置),若沒有,返回-1.

2.標頭檔案

#include<iostream>
#include<string>
#include <unordered_map>

using namespace std;

3.主函式

int main()
{
	string a = "loveleetcode";
	class Solution pt;
	int b = pt.firstUniqChar(a);
	cout << b << endl;
}

分析:定義變數,用類處理,輸出結果。

寫的程式碼都在VS2015下測試沒有問題,如果輸入為string a = "loveleetcode";

該題所有測試程式碼如下

#include<iostream>
#include<string>
#include <unordered_map>

using namespace std;

class Solution
{
public:
	int firstUniqChar(string s)
	{
		unordered_map<char, int> m;
		for (char c : s)
			m[c]++;
		for (int i = 0; i < s.size(); i++)
		{
			if (m[s[i]] == 1)
				return i;
		}
		return -1;
	}
};

int main()
{
	string a = "loveleetcode";
	class Solution pt;
	int b = pt.firstUniqChar(a);
	cout << b << endl;
}