字符串

最長回文子串

1. 題目

已知一個只包含大小寫的字符串合溺,求用該字符串可以生成的最長回文子串的長度。

2. 思路

首先要考慮回文字符串的性質(zhì):當(dāng)字符個數(shù)為奇數(shù)時庇谆,左右關(guān)與某個字符對稱岳掐,當(dāng)字符個數(shù)為偶數(shù)時左右對稱。為此可以想到如果在字符串中有奇數(shù)個某字符可以去掉一個該字符使用剩下的偶數(shù)個來構(gòu)成回文字符串饭耳,如果某個字符在字符串中有偶數(shù)個可以直接用來構(gòu)成回文串串述。最后如果字符有剩余,可直接從中取一個字符作為中間字符寞肖,這樣得到的回文子串最長纲酗。

3. 代碼實現(xiàn)

int longestPalindrome(std::string str)
{
        char charMap[128] = {0};  // 字符串哈希表
        int max_length = 0;
        int flag = 0;

        for (int i = 0; i < str.size(); i++) {
            charMap[str[i]]++;
        }
        for (int i = 0; i < 128; i++) {
            if (charMap[i] % 2 == 0) {
                max_length += charMap[i];
            }
            else {
                max_length += charMap[i] - 1;
                flag = 1;
            }
        }
        return max_length + flag;
}

詞語模式

1. 題目

給定一個字符串和一個匹配模式,如str = “dog dog great great"和匹配字符串pattern = "aabb"新蟆,那么成str和pattern匹配觅赊,確認給定的字符串和匹配模式是否匹配。

2. 思路

首先琼稻,從字符串中將單詞拆解吮螺,在拆解的過程中同時對pattern進行map映射,并維護一個used數(shù)組用來判斷pattern中的字符是否已經(jīng)使用過了。
在拆解的過程中鸠补,

  • 如果拆解的單詞在map中沒有出現(xiàn)過萝风,那么判斷當(dāng)前的pattern對應(yīng)的字符是否使用過,如果使用過就返回false紫岩,如果沒有使用就將該單詞做映射规惰。
  • 如果當(dāng)前拆解出的單詞出現(xiàn)過,判斷pattern是否匹配泉蝌,不匹配就返回false

3. 代碼

bool wordPattern(std::string pattern, std::string str)
{
    std::map<std::string, char> word_map;  // 單詞到pattern的映射表
    char used[128] = {0};
    std::string word;  // 臨時保存拆分出來的單詞
    int pos = 0;  // 指向pattern
    str.push_back(' ');

    for (int i = 0; i < str.size(); i++) {
        if (str[i] == ' ') {  // 遇到空格說明遇到了單詞
            if (pos == pattern.length()) {  // 到達pattern末尾
                return false;
            }
            // 若單詞未出現(xiàn)在哈希映射中
            if (word_map.find(word) == word_map.end()) {
                if (used[pattern[pos]]) {  // 如果當(dāng)前pattern字符已經(jīng)使用
                    return false;
                }
                word_map[word] = pattern[pos];
                used[pattern[pos]] = 1;
            }
            else {
                if (word_map[word] != pattern[pos]) {
                    return false;
                }
            }
            word = "";
            pos++;
        }
        else {
            word +=str[i];
        }
    }
    if (pos != pattern.length()) {
        return false;
    }
    return true;
}

同字符詞語分組

1. 題目

已知一組字符串歇万,將其中相同字符組成的單詞放在一起輸出.

2. 思路

得到一個單詞時候,對該單詞進行排序然后用排序后的單詞作為鍵梨与,將原始的單詞作為值進行hash存儲堕花,遇到下一個單詞的時候,對單詞進行排序判斷是否在map中出現(xiàn)過粥鞋,如果沒有則添加新的鍵缘挽,如果存在就直接將該單詞添加到該鍵所對應(yīng)的值數(shù)組里面。

3. 代碼

std::vector<std::vector<std::string>> groupAnagram(std::vector<std::string> &strs)
{
    std::map<std::string, std::vector<std::string>> mymap;  //  臨時的map
    std::vector<std::vector<std::string>> res;
    // 遍歷字符串向量
    for (auto i : strs) {
        std::string temp = i;
        std::sort(temp.begin(), temp.end());
        if (mymap.find(temp) == mymap.end()) {  // 如果在map中
            std::vector<std::string> item;
            mymap[temp] = item;
        }
        mymap[temp].push_back(i);
    }
    // 將hash表中的數(shù)據(jù)呻粹,放入res結(jié)果中
    for (auto i: mymap) {
        res.push_back(i.second);
    }

    return res;
}

無重復(fù)字符的最長子串

1. 題目

求給定的字符串中壕曼,無重復(fù)字符的最長子串

2. 思路

考慮在一次遍歷的過程中能夠得到想要的結(jié)果,此時需要使用兩個指針等浊,維護一個滑動窗口腮郊,窗口中的字符串即為我們要求的最長子串。這時問題就變成了怎么維護這個滑動窗口筹燕,兩個指針分別在什么時候移動轧飞,怎么移動;

3. 代碼

int lengthOfLongestSubStirng(std::string str)
{
    int begin = 0;
    int result = 0;
    std::string word = "";
    int char_map[128] = {0};

    for (int i = 0; i < str.size(); i++) {
        char_map[str[i]]++;
        if (char_map[str[i]] == 1) {  // word中沒有出現(xiàn)過該字符
            word += str[i];
            if (result < word.length()) {
                result = word.length();
            }
        }
        else {  // 如果在word中出現(xiàn)過
            while (begin < i && char_map[str[i]] > 1) {
                char_map[str[begin]]--;
                begin++;
            }
            word = "";
            for (int j = begin; j <= i; j++) {
                word += str[j];
            }
        }

    }
    return result;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撒踪,一起剝皮案震驚了整個濱河市过咬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌制妄,老刑警劉巖掸绞,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耕捞,居然都是意外死亡衔掸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門俺抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敞映,“玉大人,你說我怎么就攤上這事磷斧≌裨福” “怎么了诗芜?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長埃疫。 經(jīng)常有香客問我,道長孩哑,這世上最難降的妖魔是什么栓霜? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮横蜒,結(jié)果婚禮上胳蛮,老公的妹妹穿的比我還像新娘。我一直安慰自己丛晌,他們只是感情好仅炊,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澎蛛,像睡著了一般抚垄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谋逻,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天呆馁,我揣著相機與錄音,去河邊找鬼毁兆。 笑死浙滤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的气堕。 我是一名探鬼主播纺腊,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茎芭!你這毒婦竟也來了揖膜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骗爆,失蹤者是張志新(化名)和其女友劉穎次氨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摘投,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡煮寡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了犀呼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幸撕。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖外臂,靈堂內(nèi)的尸體忽然破棺而出坐儿,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布貌矿,位于F島的核電站炭菌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逛漫。R本人自食惡果不足惜黑低,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酌毡。 院中可真熱鬧克握,春花似錦、人聲如沸枷踏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旭蠕。三九已至停团,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掏熬,已是汗流浹背客蹋。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孽江,地道東北人讶坯。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像岗屏,于是被迫代替她去往敵國和親辆琅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容