閱讀245 返回首頁    go 技術社區[雲棲]


CareerCup之1.4判斷字符串是否為變位詞

【題目】

原文:

1.4 Write a method to decide if two strings are anagrams or not.

譯文:

寫一個函數判斷兩個字符串是否是變位詞。

【分析】

變位詞(anagrams)指的是組成兩個單詞的字符相同,但位置不同的單詞。比如說, abbcd和abcdb就是一對變位詞。該題目有兩種思路:

【思路一】

由於變位詞隻是字母的順序改變,字符長度,字符種類沒有改變,所以根據此我們隻要重新根據字典序排序一下,兩個字符串也就一樣了。

The eyes(眼睛)——They see.(它們看得見。)這是一對變位詞。

根據字典序排序他們都會變成:eeehtsy

時間複雜度為:O(nlogn)

【思路二】
由於組成變位詞的字符是一模一樣的, 因此我們可以先統計每個字符串中各個字符出現的次數, 然後看這兩個字符串中各字符出現次數是否一樣。如果是,則它們是一對變位詞。 這需要開一個輔助數組來保存各字符的出現次數。我們可以開一個大小是256的整數數組, 遍曆第一個字符串時,將相應字符出現的次數加1;遍曆第二個字符串時, 將相應字符出現的次數減1。最後如果數組中256個數都為0,說明兩個字符串是一對變位詞。 (第1個字符串中出現的字符都被第2個字符串出現的字符抵消了), 如果數組中有一個不為0,說明它們不是一對變位詞。

【代碼一】

/*********************************
*   日期:2014-05-06
*   作者:SJF0115
*   題目: 判斷字符串是否為變位詞
*   來源:CareerCup
**********************************/
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

//判斷字符串是否為變位詞
bool IsAnagrams(string str1,string str2){
    if(str1 == "" || str2 == ""){
        return false;
    }
    int len1 = str1.length();
    int len2 = str2.length();
    //變位詞長度一樣
    if(len1 != len2){
        return false;
    }
    //排序
    sort(&str1[0],&str1[0]+len1);
    sort(&str2[0],&str2[0]+len2);
    if(str1 == str2){
        return true;
    }
    else{
        return false;
    }
}

int main(){
    char str1[] = "the eyes";
    char str2[] = "they see";
    bool result = IsAnagrams(str1,str2);
    cout<<result<<endl;
    return 0;
}

【代碼二】

//判斷字符串是否為變位詞
bool IsAnagrams(string str1,string str2){
    int i;
    if(str1 == "" || str2 == ""){
        return false;
    }
    int len1 = str1.length();
    int len2 = str2.length();
    //變位詞長度一樣
    if(len1 != len2){
        return false;
    }
    //初始化
    int vis[256];
    memset(vis,0,sizeof(vis));
    //遍曆第一個字符串,將相應字符出現的次數加1
    //遍曆第二個字符串,將相應字符出現的次數減1
    for(i = 0;i < len1;i++){
        vis[str1[i]] ++;
        vis[str2[i]] --;
    }
    //判斷是否為變位詞 如果數組中256個數都為0,說明兩個字符串是一對變位詞。
    for(i = 0;i < 256;i++){
        if(vis[i] != 0){
            return false;
        }
    }
    return true;
}







最後更新:2017-04-03 12:56:33

  上一篇:go java中Integer包裝類的詳細講解(java二進製操作,所有進製轉換)
  下一篇:go hi3531 SDK 編譯 kernel, 修改 參數