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

算法學(xué)習(xí)——LeetCode力扣字符串篇

這篇具有很好參考價(jià)值的文章主要介紹了算法學(xué)習(xí)——LeetCode力扣字符串篇。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

算法學(xué)習(xí)——LeetCode力扣字符串篇

算法學(xué)習(xí)——LeetCode力扣字符串篇,LeetCode算法學(xué)習(xí),算法,學(xué)習(xí),leetcode,c++,c,秋招,八股文

344. 反轉(zhuǎn)字符串

344. 反轉(zhuǎn)字符串 - 力扣(LeetCode)

描述

編寫一個(gè)函數(shù),其作用是將輸入的字符串反轉(zhuǎn)過(guò)來(lái)。輸入字符串以字符數(shù)組 s 的形式給出。

不要給另外的數(shù)組分配額外的空間,你必須原地修改輸入數(shù)組、使用 O(1) 的額外空間解決這一問(wèn)題。

示例

示例 1:

輸入:s = [“h”,“e”,“l(fā)”,“l(fā)”,“o”]
輸出:[“o”,“l(fā)”,“l(fā)”,“e”,“h”]

示例 2:

輸入:s = [“H”,“a”,“n”,“n”,“a”,“h”]
輸出:[“h”,“a”,“n”,“n”,“a”,“H”]

提示

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 碼表中的可打印字符

代碼解析

中間變量交換
class Solution {
public:
    void reverseString(vector<char>& s) {

        char temp;
        
        for(int i=0 ;i<s.size()/2;i++)
        {
            temp = s[i];
            s[i] = s[s.size()-1 - i];
            s[s.size()-1 - i] = temp;
        }
    }
};

使用對(duì)調(diào)函數(shù)
void reverseString(vector<char>& s) {
    for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
        swap(s[i],s[j]);
    }
}

使用反轉(zhuǎn)庫(kù)函數(shù)
class Solution {
public:
    void reverseString(vector<char>& s) {

       reverse(s.begin(),s.end());
    }
};

541. 反轉(zhuǎn)字符串 II

541. 反轉(zhuǎn)字符串 II - 力扣(LeetCode)

描述

給定一個(gè)字符串 s 和一個(gè)整數(shù) k,從字符串開(kāi)頭算起,每計(jì)數(shù)至 2k 個(gè)字符,就反轉(zhuǎn)這 2k 字符中的前 k 個(gè)字符。

如果剩余字符少于 k 個(gè),則將剩余字符全部反轉(zhuǎn)。
如果剩余字符小于 2k 但大于或等于 k 個(gè),則反轉(zhuǎn)前 k 個(gè)字符,其余字符保持原樣。

示例

示例 1:

輸入:s = “abcdefg”, k = 2
輸出:“bacdfeg”

示例 2:

輸入:s = “abcd”, k = 2
輸出:“bacd”

提示

  • 1 <= s.length <= 104
  • s 僅由小寫英文組成
  • 1 <= k <= 104
代碼解析
class Solution {
public:
    void rever(string &s ,int left ,int right)
    {
        while(left<right)
        {
            char tmp = s[right];
            s[right] = s[left];
            s[left] = tmp;
            left++;
            right--;
        }
        return;
    }
    string reverseStr(string s, int k) {
       int i=0;
       int flag=1;;
       for(i=0 ; i+k <s.size() ; i+=k)
       {
           if(flag==1) flag = 0;
           else if(flag == 0) 
           {
               flag =1;
               continue;
           }
            int left = i;
            int right = left+k-1;
            rever(s,left,right);
       }
         if( flag==1 ) rever(s,i,s.size()-1);
        return s;
    }
};

151. 反轉(zhuǎn)字符串中的單詞

151. 反轉(zhuǎn)字符串中的單詞 - 力扣(LeetCode)

描述

給你一個(gè)字符串 s ,請(qǐng)你反轉(zhuǎn)字符串中 單詞 的順序。

單詞 是由非空格字符組成的字符串。s 中使用至少一個(gè)空格將字符串中的 單詞 分隔開(kāi)。

返回 單詞 順序顛倒且 單詞 之間用單個(gè)空格連接的結(jié)果字符串。

**注意:**輸入字符串 s中可能會(huì)存在前導(dǎo)空格、尾隨空格或者單詞間的多個(gè)空格。返回的結(jié)果字符串中,單詞間應(yīng)當(dāng)僅用單個(gè)空格分隔,且不包含任何額外的空格。

示例

示例 1:

輸入:s = “the sky is blue”
輸出:“blue is sky the”

示例 2:

輸入:s = " hello world "
輸出:“world hello”
解釋:反轉(zhuǎn)后的字符串中不能存在前導(dǎo)空格和尾隨空格。

示例 3:

輸入:s = “a good example”
輸出:“example good a”
解釋:如果兩個(gè)單詞間有多余的空格,反轉(zhuǎn)后的字符串需要將單詞間的空格減少到僅有一個(gè)。

提示

  • 1 <= s.length <= 104
  • s 包含英文大小寫字母、數(shù)字和空格 ’ ’
  • s 中 至少存在一個(gè) 單詞

進(jìn)階

如果字符串在你使用的編程語(yǔ)言中是一種可變數(shù)據(jù)類型,請(qǐng)嘗試使用 O(1) 額外空間復(fù)雜度的 原地 解法。

代碼解析

雙指針
class Solution {
public:
    string reverseWords(string s) {

       int left=0 ,right=1;
        string result , temp;

        if(s.size()==1) return s;//針對(duì)單一字母
        
        while( left < right && right<s.size() )//找到左指針位置,單詞第一個(gè)字母處
        {
            while(s[left]==' ')
            {
                left++;
                right++;
                if(right > s.size()) %應(yīng)對(duì)單詞后面多個(gè)空格沒(méi)有新單詞,類似“abc        ”
                {
                     result.erase(result.size()-1,1);
                     return result;
                }
            }
            while(s[right]!=' '&& s[right]!='\0')//確定右指針位置,在單詞最后一個(gè)字母后
            {
                right++;
            }
            temp = s.substr(left,right-left);//抽取子串
            temp +=' ';//添加空格
            result.insert(0, temp);//頭插字串

            left = right;
            right= left+1;
        }
        result.erase(result.size()-1,1);//去除最后一個(gè)空格
        return result;
    }
};

低空間復(fù)雜度,反轉(zhuǎn)庫(kù)函數(shù)

首先去除多余空格,之后整個(gè)字符串反轉(zhuǎn),最后每個(gè)單詞反轉(zhuǎn)

class Solution {
public:
    string reverseWords(string s) {

        int left=0 , right=0;
        //去除多余的空格
        while(right < s.size())
        {
            if(left==0 && s[right] ==' ')
            {
                right++;
            }
            else if(left != 0 &&  s[right-1] ==' '&&s[right] ==' ')
            {
                right++;
            }else
            {
                s[left] = s[right];
                left++;
                right++;
            }
        }
        if(s[left-1]==' ')left--;//針對(duì)最后一個(gè)是空格
        s.resize(left);
        //反轉(zhuǎn)字符串
        reverse(s.begin(),s.end());
        //反轉(zhuǎn)單詞
        left=0 , right=0;
        while(right <= s.size())
        {
            while(s[right] != ' '&& right<s.size()) right++;
            reverse(s.begin() + left, s.begin() + right);
            left = right+1;
            right=left+1;
         }

        return s;
    }
};

低空間復(fù)雜度,無(wú)庫(kù)函數(shù)
class Solution {
public:
    void reverse(string& s, int start, int end){ //翻轉(zhuǎn),區(qū)間寫法:左閉又閉 []
        for (int i = start, j = end; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }

    void removeExtraSpaces(string& s) {//去除所有空格并在相鄰單詞之間添加空格, 快慢指針。
        int slow = 0;   //整體思想?yún)⒖糷ttps://programmercarl.com/0027.移除元素.html
        for (int i = 0; i < s.size(); ++i) { //
            if (s[i] != ' ') { //遇到非空格就處理,即刪除所有空格。
                if (slow != 0) s[slow++] = ' '; //手動(dòng)控制空格,給單詞之間添加空格。slow != 0說(shuō)明不是第一個(gè)單詞,需要在單詞前添加空格。
                while (i < s.size() && s[i] != ' ') { //補(bǔ)上該單詞,遇到空格說(shuō)明單詞結(jié)束。
                    s[slow++] = s[i++];
                }
            }
        }
        s.resize(slow); //slow的大小即為去除多余空格后的大小。
    }

    string reverseWords(string s) {
        removeExtraSpaces(s); //去除多余空格,保證單詞之間之只有一個(gè)空格,且字符串首尾沒(méi)空格。
        reverse(s, 0, s.size() - 1);
        int start = 0; //removeExtraSpaces后保證第一個(gè)單詞的開(kāi)始下標(biāo)一定是0。
        for (int i = 0; i <= s.size(); ++i) {
            if (i == s.size() || s[i] == ' ') { //到達(dá)空格或者串尾,說(shuō)明一個(gè)單詞結(jié)束。進(jìn)行翻轉(zhuǎn)。
                reverse(s, start, i - 1); //翻轉(zhuǎn),注意是左閉右閉 []的翻轉(zhuǎn)。
                start = i + 1; //更新下一個(gè)單詞的開(kāi)始下標(biāo)start
            }
        }
        return s;
    }
};

28. 找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo)

28. 找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo) - 力扣(LeetCode)

描述

給你兩個(gè)字符串 haystack 和 needle ,請(qǐng)你在 haystack 字符串中找出 needle 字符串的第一個(gè)匹配項(xiàng)的下標(biāo)(下標(biāo)從 0 開(kāi)始)。如果 needle 不是 haystack 的一部分,則返回 -1 。

示例

示例 1:

輸入:haystack = “sadbutsad”, needle = “sad”
輸出:0
解釋:“sad” 在下標(biāo) 0 和 6 處匹配。
第一個(gè)匹配項(xiàng)的下標(biāo)是 0 ,所以返回 0 。

示例 2:

輸入:haystack = “l(fā)eetcode”, needle = “l(fā)eeto”
輸出:-1
解釋:“l(fā)eeto” 沒(méi)有在 “l(fā)eetcode” 中出現(xiàn),所以返回 -1 。

提示

  • 1 <= haystack.length, needle.length <= 104
  • haystack 和 needle 僅由小寫英文字符組成

代碼解析

庫(kù)函數(shù)
class Solution {
public:
    int strStr(string haystack, string needle) {
        return haystack.find(needle);
    }
};

暴力法
class Solution {
public:
    int strStr(string haystack, string needle) {

        for(int left=0 ; left < haystack.size() ;left++)
        {
            if(haystack[left] == needle[0])
            {
                for(int right = left ,i=0; right < haystack.size() && i<needle.size(); right++,i++)
                {
                    if(haystack[right] == needle[i])
                    {
                        if(i==needle.size()-1)
                        {
                            return left;
                        }
                        continue;
                    }
                    else break;
                }
            }
        }

        return -1;

    }
};

KMP
class Solution {
public:
    void getNext(int *next ,const string &s)
    {
        int j=-1;
        next[0] = j;
        for(int i=1 ; i<s.size();i++)
        {
            while( j>=0 && s[i] != s[j+1] )
                j = next[j];

            if(s[i] == s[j+1]) j++;
            
            next[i] = j;
        }

    }
    int strStr(string haystack, string needle) {
       if(needle.size() == 0 ) return 0;

       int next[needle.size()];
       int j=-1;
       getNext(next , needle);
       
       for(int i=0 ; i<haystack.size() ;i++)
       {
            while(j>=0 && haystack[i] != needle[j+1])
                j = next[j];

            if(haystack[i] == needle[j+1]) j++;

            if( j == needle.size() - 1 )
                return (i-needle.size()+1);
       }
       return -1;
    }
};

459. 重復(fù)的子字符串

459. 重復(fù)的子字符串 - 力扣(LeetCode)

描述

給定一個(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)成。 (或子串 “abcabc” 重復(fù)兩次構(gòu)成。)

提示

  • 1 <= s.length <= 104
  • s 由小寫英文字母組成

代碼解析

移動(dòng)匹配

算法學(xué)習(xí)——LeetCode力扣字符串篇,LeetCode算法學(xué)習(xí),算法,學(xué)習(xí),leetcode,c++,c,秋招,八股文
算法學(xué)習(xí)——LeetCode力扣字符串篇,LeetCode算法學(xué)習(xí),算法,學(xué)習(xí),leetcode,c++,c,秋招,八股文

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        string tmp = s + s;
        tmp.erase(0,1);
        tmp.erase(tmp.size()-1,1);

        if(tmp.find(s) == -1) return false;
        else return true;
    }
};

KMP

代碼隨想錄文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-828627.html

class Solution {
public:
    void getNext(int* next, const string& s)
    {
        int j = -1;
        next[0] = j;
        for (int i = 1; i < s.size(); i++)
        {
            while (j >= 0 && s[i] != s[j + 1])
            {
                j = next[j ];
            }
            if (s[i] == s[j + 1]) j++;

            next[i] = j;
        }
    }


    bool repeatedSubstringPattern(string s) {

       if (s.size() == 0) {
            return false;
        }
        int *next = new int[substr.size()];
        //計(jì)算整個(gè)文字串的next數(shù)組,如果文字串是循環(huán)的,一個(gè)循環(huán)next都是-1,之后的從0開(kāi)始遞增。next的最后一位的值=(循環(huán)次數(shù)-1)*循環(huán)體長(zhǎng)度 -1
        getNext(next, s);
        int len = s.size();
        //文字串的長(zhǎng)度減去next數(shù)組最后一位+1 ,得到是循環(huán)體長(zhǎng)度
        // 如果next數(shù)組最后一位不是-1(意味著之前匹配成功) , 并且文字串長(zhǎng)度對(duì)循環(huán)體長(zhǎng)度可以整除
        if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) 
        {
            delete[] next;
            return true;
        }
        delete[] next;
        return false;
    }
};

到了這里,關(guān)于算法學(xué)習(xí)——LeetCode力扣字符串篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(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)文章

  • LeetCode:459. 重復(fù)的子字符串 —【2、KMP算法】

    LeetCode:459. 重復(fù)的子字符串 —【2、KMP算法】

    ??道阻且長(zhǎng),行則將至。?? ??算法,不如說(shuō)它是一種思考方式?? 算法專欄: ????123 題目描述 :給定一個(gè)非空的字符串 s ,檢查是否可以通過(guò)由它的一個(gè)子串重復(fù)多次構(gòu)成。 來(lái)源:力扣(LeetCode) 難度: 簡(jiǎn)單 提示: 1 = s.length = 104 s 由小寫英文字母組成 示例 1: 輸入:

    2024年02月04日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之字符串: Leetcode 557. 反轉(zhuǎn)字符串中的單詞 III (Typescript版)

    翻轉(zhuǎn)字符串中的單詞 III https://leetcode.cn/problems/reverse-words-in-a-string-iii/ 描述 給定一個(gè)字符串 s ,你需要反轉(zhuǎn)字符串中每個(gè)單詞的字符順序,同時(shí)仍保留空格和單詞的初始順序。 示例 1: 示例 2: 提示: 1 = s.length = 5 * 1 0 4 10^4 1 0 4 s 包含可打印的 ASCII 字符。 s 不包含任何開(kāi)頭或

    2024年02月01日
    瀏覽(24)
  • 代碼隨想錄 Leetcode459. 重復(fù)的子字符串(KMP算法)

    代碼隨想錄 Leetcode459. 重復(fù)的子字符串(KMP算法)

    ? ? ? ? 此解法讀者需要了解什么是KMP算法以及KMP算法中next數(shù)組的具體含義才能理解 ? ? ? ? 因?yàn)樵贙MP算法的next數(shù)組中,next[index]表示 i ndex之前的最大長(zhǎng)度的相同前綴后綴值 ,那么要判斷整個(gè)字符串中是否由重復(fù)字串構(gòu)成,只需要以下兩個(gè)條件: ? ? ? ? 1.next[n - 1] !=

    2024年01月19日
    瀏覽(100)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之字符串: Leetcode 20. 有效的括號(hào) (Typescript版)

    有效的括號(hào) https://leetcode.cn/problems/valid-parentheses/ 描述 給定一個(gè)只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號(hào)必須用相同類型的右括號(hào)閉合。 左括號(hào)必須以正確的順序閉合。 每個(gè)右括號(hào)都有一個(gè)對(duì)應(yīng)的相

    2024年02月01日
    瀏覽(22)
  • 【編碼狂想】LeetCode 字符串和數(shù)組篇:挑戰(zhàn)算法精髓,深化程序設(shè)計(jì)基礎(chǔ)

    【編碼狂想】LeetCode 字符串和數(shù)組篇:挑戰(zhàn)算法精髓,深化程序設(shè)計(jì)基礎(chǔ)

    ? ?? 個(gè)人主頁(yè): Sarapines Programmer ??? 系列專欄: 本期文章收錄在《C語(yǔ)言闖關(guān)筆記》,大家有興趣可以瀏覽和關(guān)注,后面將會(huì)有更多精彩內(nèi)容! ??翰墨致贈(zèng):翩翩風(fēng)華激彩虹,豪情壯志醉長(zhǎng)空。 劍指星河舞紅塵,夢(mèng)馳烈馬向未來(lái)。 ? ? ??歡迎大家關(guān)注??點(diǎn)贊??收藏

    2024年02月04日
    瀏覽(26)
  • 【算法|動(dòng)態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    【算法|動(dòng)態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時(shí),記錄一下自己的學(xué)習(xí)過(guò)程,希望對(duì)大家有所幫助 ??希望我們一起努力、成長(zhǎng),共同進(jìn)步。

    2024年02月06日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之字符串: Leetcode 696. 計(jì)數(shù)二進(jìn)制子串 (Typescript版)

    計(jì)數(shù)二進(jìn)制子串 https://leetcode.cn/problems/count-binary-substrings/ 描述 給定一個(gè)字符串 s,統(tǒng)計(jì)并返回具有相同數(shù)量 0 和 1 的非空(連續(xù))子字符串的數(shù)量,并且這些子字符串中的所有 0 和所有 1 都是成組連續(xù)的。 重復(fù)出現(xiàn)(不同位置)的子串也要統(tǒng)計(jì)它們出現(xiàn)的次數(shù)。 示例 1: 示

    2024年02月01日
    瀏覽(96)
  • 算法訓(xùn)練day11Leetcode20有效的括號(hào)1047刪除字符串中所有相鄰重復(fù)項(xiàng)150逆波蘭表達(dá)式求值

    https://leetcode.cn/problems/valid-parentheses/description/ https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html 判斷右括號(hào)后忘記pop 括號(hào)匹配是使用棧解決的經(jīng)典問(wèn)題。 如果還記得編譯原理的話,編譯器在 詞法分析的過(guò)程中處理括號(hào)、花括號(hào)等這個(gè)符號(hào)的邏輯,也是使用了棧

    2024年01月17日
    瀏覽(20)
  • ( 字符串) 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)
  • 【LeetCode】《LeetCode 101》第十二章:字符串

    【LeetCode】《LeetCode 101》第十二章:字符串

    思路及代碼: 242 . 有效的字母異位詞 思路及代碼: 205. 同構(gòu)字符串 思路及代碼: 647. 回文子串 思路及代碼: 696 . 計(jì)數(shù)二進(jìn)制子串 思路及代碼 : 224. 基本計(jì)算器 思路及代碼: 227. 基本計(jì)算器 II 思路與代碼: 28 . 找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo) 思路及代碼 :409. 最長(zhǎng)回文

    2024年02月10日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包