国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【每日撓頭算法題(1)】——旋轉(zhuǎn)字符串|親密字符串

這篇具有很好參考價(jià)值的文章主要介紹了【每日撓頭算法題(1)】——旋轉(zhuǎn)字符串|親密字符串。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


一、旋轉(zhuǎn)字符串

點(diǎn)我直達(dá)終點(diǎn)~

【每日撓頭算法題(1)】——旋轉(zhuǎn)字符串|親密字符串

思路1

前提:如果s串和goal串長(zhǎng)度不等,則goal串不可能是s串旋轉(zhuǎn)得來(lái),直接返回false;

通過(guò)觀(guān)察,可以發(fā)現(xiàn)每旋轉(zhuǎn)一次,第一個(gè)字符就會(huì)出現(xiàn)在最后一個(gè)字符的位置處,其余字符均往前挪動(dòng)一個(gè)位置。

所以我們首先將第一個(gè)字符保存,然后挪動(dòng)其他字符,再將保存的字符放到最后。

其次判斷s和goal是否相等,如果不等,則繼續(xù)按照上述方式旋轉(zhuǎn)

注意:如果旋轉(zhuǎn)s的長(zhǎng)度次后,與goal仍然不想等,返回false

代碼:

class Solution {
public:
    bool rotateString(string s, string goal) 
    {
    	if(s.size()!=goal.size())
    		return false;
    		
        for(int j = 0 ; j <s.size();++j)
        {
           char ch = s[0];
                //旋轉(zhuǎn)一遍
            for(int i = 1;i <s.size();++i)
            {
                s[i-1] = s[i];
            }
            s[s.size()-1] = ch;
            if(s == goal)
            {
                return true;
            }
        }

        //如果旋轉(zhuǎn)完s.size()遍,還不是true,那就false
        return false;
    }
};

時(shí)間復(fù)雜度:O(N^2) 空間復(fù)雜度:O(1)(原地旋轉(zhuǎn))

思路2

前提:如果s串和goal串長(zhǎng)度不等,則goal串不可能是s串旋轉(zhuǎn)得來(lái),直接返回false;

一個(gè)巧妙的解法:運(yùn)用如果goal串由s串旋轉(zhuǎn)得來(lái),那么goal串一定是s+s串的子串。
只需要判斷goal字符串是否為s+s串的子串即可。

class Solution 
{
public:
    bool rotateString(string s, string goal)
    {
        string ss = s+s;
        if(s.size() == goal.size() && ss.find(goal) != string::npos)
            return true;
        return false;
    }
};

時(shí)間復(fù)雜度:O(N) 空間復(fù)雜度O(N)

二、親密字符串

點(diǎn)我直達(dá)終點(diǎn)~
【每日撓頭算法題(1)】——旋轉(zhuǎn)字符串|親密字符串

思路

前提:如果s串和goal串長(zhǎng)度不等,則goal串不可能是s串旋轉(zhuǎn)得來(lái),直接返回false;

對(duì)于這道題,首先遍歷一遍s串,一邊遍歷一邊與goal字符串進(jìn)行對(duì)比,如果對(duì)應(yīng)下標(biāo)的goal串的字符和s串的對(duì)應(yīng)下標(biāo)的字符不相等,則記錄不等的字符和下標(biāo)。(s串和goal串一定只有兩個(gè)不相等的字符)

找到后,如果pos1下標(biāo)和pos2下標(biāo)相同,說(shuō)明s串和goal串一定相等。
然而這里存在兩種情況,如題目描述:
情況1:ab和ab
情況2:aa和aa
此時(shí)我們不需要分情況討論,只需要找到s字符串的任意一個(gè)字符如果出現(xiàn)兩次及以上,則說(shuō)明交換s字符串的任意兩個(gè)相同的字符一定與goal字符串相等。
比如: aabab 和aabab,s字符串中的a出現(xiàn)了三次,b出現(xiàn)了兩次,
那么無(wú)論怎么交換其中的a或者b,s字符串始終和goal字符串相等。

如果字符串pos1下標(biāo)和pos2下標(biāo)不同,則交換對(duì)應(yīng)的pos1和pos2的字符,再判斷是否與goal串相等即可。

詳細(xì)請(qǐng)看代碼:

class Solution {
public:
    bool buddyStrings(string s, string goal) 
    {   
        //1.長(zhǎng)度不等,必然不是親密字符串
        if(s.size()!=goal.size())
            return false;

        char arr[2];
        //找第一個(gè)不相同的字符,并記錄下標(biāo)
        int i = 0;
        int pos1 = 0,pos2 = 0;
        for(; i<s.size();++i)
        {
            if(s[i]!=goal[i])
            {
                arr[0] = s[i];
                pos1 = i;
                break;
            }
        }

        //找第二個(gè)不相同的字符
        for(i+=1; i<s.size();++i)
        {
            if(s[i]!=goal[i])
            {
                arr[1] = s[i];
                pos2 = i;
                break;
            }
        }
        //  如果pos1 == pos2,說(shuō)明s和goal是完全相等的兩個(gè)串
        //此時(shí)有兩種情況,如果s中有兩個(gè)位置交換后還是原來(lái)的s,此時(shí)s和goal相等。
        //但不管是哪種情況,我們都只需要找出任意一個(gè)字符出現(xiàn)2次及以上就可以知道是親密字符串
        if(pos1 == pos2)
        {
            vector<int> count(26);
            for(int i = 0;i<s.size();++i)
            {
                count[s[i] - 'a']++;
                if(count[s[i] - 'a']>=2)
                    return true;
            }
            return false;
        }

        //此種情況不是s串和goal串相等,那么正常交換兩個(gè)字符的位置然后判斷是否與goal相等即可。
        else
        {
            swap(s[pos1],s[pos2]);
            if(s == goal)
                return true;

             return false;
        }
    }
};

時(shí)間復(fù)雜度:O(N); 空間復(fù)雜度O(1) 只消耗常量個(gè)空間,即26


總結(jié)

通過(guò)這兩道題,學(xué)習(xí)到了旋轉(zhuǎn)字符串的一般規(guī)律是轉(zhuǎn)化為找子串的問(wèn)題;
而親密字符串的本質(zhì)就是分情況討論

情況1:如果s!=goal
情況2:如果s==goal

的分別處理方式。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-477625.html

到了這里,關(guān)于【每日撓頭算法題(1)】——旋轉(zhuǎn)字符串|親密字符串的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【每日算法】【205. 同構(gòu)字符串】

    【每日算法】【205. 同構(gòu)字符串】

    ??博客主頁(yè):CSDN博客主頁(yè) ??本文由 我是小狼君 原創(chuàng),首發(fā)于 CSDN?? ??學(xué)習(xí)專(zhuān)欄推薦:面試匯總 ??游戲框架專(zhuān)欄推薦:游戲?qū)嵱每蚣軐?zhuān)欄 ??點(diǎn)贊 ?? 收藏 ?留言 ??,如有錯(cuò)誤請(qǐng)指正 ?? 未來(lái)很長(zhǎng),值得我們?nèi)Ρ几案篮玫纳? 老規(guī)矩,先介紹一下 Unity 的科

    2024年02月11日
    瀏覽(26)
  • 每日OJ題_算法_滑動(dòng)窗口⑥_力扣438. 找到字符串中所有字母異位詞

    目錄 力扣438. 找到字符串中所有字母異位詞 解析及代碼1 解析及代碼2 438. 找到字符串中所有字母異位詞 - 力扣(LeetCode) 難度 中等 給定兩個(gè)字符串? s ?和? p ,找到? s ? 中所有? p ? 的? 異位詞? 的子串,返回這些子串的起始索引。不考慮答案輸出的順序。 異位詞? 指由

    2024年01月24日
    瀏覽(30)
  • 算法學(xué)習(xí)——LeetCode力扣補(bǔ)充篇11(64. 最小路徑和、48. 旋轉(zhuǎn)圖像 、169. 多數(shù)元素、394. 字符串解碼、240. 搜索二維矩陣 II )

    算法學(xué)習(xí)——LeetCode力扣補(bǔ)充篇11(64. 最小路徑和、48. 旋轉(zhuǎn)圖像 、169. 多數(shù)元素、394. 字符串解碼、240. 搜索二維矩陣 II )

    64. 最小路徑和 - 力扣(LeetCode) 描述 給定一個(gè)包含非負(fù)整數(shù)的 m x n 網(wǎng)格 grid ,請(qǐng)找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。 說(shuō)明:每次只能向下或者向右移動(dòng)一步。 示例 示例 1: 輸入:grid = [[1,3,1],[1,5,1],[4,2,1]] 輸出:7 解釋?zhuān)阂驗(yàn)槁窂?1→3→1→

    2024年04月23日
    瀏覽(31)
  • 判斷字符串旋轉(zhuǎn)

    寫(xiě)一個(gè)函數(shù),判斷一個(gè)字符串是否為另一個(gè)字符串旋轉(zhuǎn)后的字符串。 這道題主要有兩個(gè)思路:第一,利用字符串旋轉(zhuǎn)(之前的博客)這種方法對(duì)每旋轉(zhuǎn)一次后的字符串進(jìn)行判斷;第二,利用庫(kù)函數(shù),這種方法未必比第一種效率高,但是這種方法寫(xiě)起來(lái)很快。這篇博客重點(diǎn)介紹

    2024年02月10日
    瀏覽(19)
  • ( 字符串) 205. 同構(gòu)字符串 ——【Leetcode每日一題】

    ( 字符串) 205. 同構(gòu)字符串 ——【Leetcode每日一題】

    難度:簡(jiǎn)單 給定兩個(gè)字符串 s 和 t ,判斷它們是否是同構(gòu)的。 如果 s 中的字符可以按某種映射關(guān)系替換得到 t ,那么這兩個(gè)字符串是同構(gòu)的。 每個(gè)出現(xiàn)的字符都應(yīng)當(dāng)映射到另一個(gè)字符,同時(shí)不改變字符的順序。不同字符不能映射到同一個(gè)字符上,相同字符只能映射到同一個(gè)

    2024年02月02日
    瀏覽(65)
  • 找兇手,定名次,字符串旋轉(zhuǎn),楊氏矩陣

    1.找兇手問(wèn)題: //題目名稱(chēng): //猜兇手 //題目?jī)?nèi)容: //日本某地發(fā)生了一件謀殺案,警察通過(guò)排查確定兇手必為4個(gè)嫌疑犯的一個(gè)。 //以下為4個(gè)嫌疑犯的供詞: //A說(shuō):不是我 //B說(shuō):是C //C說(shuō):是D //D說(shuō):C在胡說(shuō) //已知3個(gè)人說(shuō)的是真話(huà),1個(gè)人說(shuō)的是假話(huà)。 //請(qǐng)根據(jù)這些信息,寫(xiě)

    2023年04月23日
    瀏覽(24)
  • 判斷一個(gè)字符串是否為另一個(gè)字符串旋轉(zhuǎn)之后的字符串 (arr1是arr2右旋得到)

    問(wèn)題: 1.判斷函數(shù)傳參時(shí)忘記給arr2加[] 2.把if放在for之外,導(dǎo)致判斷不出,程序報(bào)錯(cuò)

    2024年02月16日
    瀏覽(29)
  • 【C語(yǔ)言練習(xí)】字符串旋轉(zhuǎn)你會(huì)嘛?

    【C語(yǔ)言練習(xí)】字符串旋轉(zhuǎn)你會(huì)嘛?

    實(shí)現(xiàn)一個(gè)函數(shù),可以左旋字符串中的k個(gè)字符。例如: ABCD左旋一個(gè)字符得到BCDA ABCD左旋兩個(gè)字符得到CDAB ?要左旋 k 個(gè)字符,我們首先應(yīng)該考慮左旋 1 1 1 個(gè)字符怎么做。左旋一個(gè)字符分為以下的三步: 取出字符串中最左邊的一個(gè)字符 將字符串中剩下的字符按從左到右的順序

    2024年02月10日
    瀏覽(20)
  • (字符串 ) 459. 重復(fù)的子字符串——【Leetcode每日一題】

    (字符串 ) 459. 重復(fù)的子字符串——【Leetcode每日一題】

    難度:簡(jiǎn)單 給定一個(gè)非空的字符串 s ,檢查是否可以通過(guò)由它的一個(gè)子串重復(fù)多次構(gòu)成。 示例 1: 輸入: s = “abab” 輸出: true 解釋: 可由子串 “ab” 重復(fù)兩次構(gòu)成。 示例 2: 輸入: s = “aba” 輸出: false 示例 3: 輸入: s = “abcabcabcabc” 輸出: true 解釋: 可由子串 “abc” 重復(fù)四次構(gòu)

    2024年02月07日
    瀏覽(22)
  • 每日一題——字符串變形

    題目 對(duì)于一個(gè)長(zhǎng)度為 n 字符串,我們需要對(duì)它做一些變形。 首先這個(gè)字符串中包含著一些空格,就像\\\"Hello World\\\"一樣,然后我們要做的是把這個(gè)字符串中由空格隔開(kāi)的單詞反序,同時(shí)反轉(zhuǎn)每個(gè)字符的大小寫(xiě)。 比如\\\"Hello World\\\"變形后就變成了\\\"wORLD hELLO\\\"。 需要考慮字符串結(jié)尾是空

    2024年02月13日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包