程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [LeetCode] Anagrams

[LeetCode] Anagrams

編輯:C++入門知識

[LeetCode] Anagrams


 

Anagrams


 

Given an array of strings, return all groups of strings that are anagrams.

Note: All inputs will be in lower-case.

解題思路:

anagrams(變位字)是指對於兩個單詞來說,長度相同,且構成的字符除了順序可以不同外,個數都相同。如cinema和iceman就是變位字。

判斷兩個字符串(長度需要相同)是否為變位字的方法,可以先對一個字符串每種字符進行計數,然後遍歷另外一個字符串,對相應的位作減操作。若其中某個字符的計數出現負數,則為非變位字,否則,他們互相為變位字。這種方法的時間復雜度為O(n)。但是每次都需要遍歷這個字符串。按這種思路寫的代碼如下。產生超時。

 

class Solution {
public:
    vector anagrams(vector& strs) {
        vector result;
        
        int len = strs.size();
        
        bool checked[len];
        memset(checked, 0, len*sizeof(bool));
        
        for(int i=0; i另外一種辦法,判斷兩個字符串是否互為變位字,首先將他們排序,若排序後他們相同,那麼他們就是變位字。雖然單獨判斷的時間復雜度為O(nlogn),但是這個信息能夠重復利用。對於這道題就是如此。因此可以用一個hash表記錄所有變位字。

 

 

class Solution {
public:
    vector anagrams(vector& strs) {
        vector result;
        
        map> codeToStrs;
        int len = strs.size();
        for(int i=0; i>::iterator it = codeToStrs.begin(); it!=codeToStrs.end(); it++){
            if(it->second.size()<2){
                continue;
            }
            result.insert(result.begin(), it->second.begin(), it->second.end());  
        }
        
        return result;
    }
    
    string getCode(string s){
        std::sort(s.begin(), s.end());
        return s;
    }
};


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved