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

(搜索) 劍指 Offer 38. 字符串的排列 ——【Leetcode每日一題】

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

?劍指 Offer 38. 字符串的排列

難度:中等

輸入一個(gè)字符串,打印出該字符串中字符的所有排列。

你可以以任意順序返回這個(gè)字符串?dāng)?shù)組,但里面 不能有重復(fù)元素。

示例:

輸入:s = “abc”
輸出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

限制

  • 1 <= s 的長(zhǎng)度 <= 8

??思路:回溯

可以直接暴力窮舉,但是如果字符串 s 內(nèi)有重復(fù)字符,要考慮怎么去重。

  • 先對(duì)原始的字符串進(jìn)行排序,保證相同的字符都相鄰;
  • 然后定義一個(gè) hasUsed 數(shù)組來(lái)保存每一位是否被訪問(wèn)過(guò);
  • 在遞歸函數(shù)中,我們限制每次填入的字符一定是這個(gè)字符所在重復(fù)字符集合中「從左往右第一個(gè)未被填入的字符」,即
    • 當(dāng) i > 0 && s[i - 1] == s[i] && !hasUsed[i - 1] 時(shí),則 continue 跳過(guò),即可去重。
    • 這個(gè)限制條件保證了對(duì)于重復(fù)的字符,我們一定是從左往右依次加入字符串中的。

??代碼:(C++、Java)

C++

class Solution {
private:
    vector<string> ans;

    void backtracking(const string& s, string& temp, vector<int>& hasUsed){
        if(temp.size() == s.size()){
            ans.push_back(temp);
            return;
        }
        for(int i = 0; i < s.size(); i++){
            if(hasUsed[i] == 1) continue;
            //去重
            if(i > 0 && s[i] == s[i - 1] && hasUsed[i - 1] == 0) continue;

            hasUsed[i] = 1;
            temp.push_back(s[i]);
            backtracking(s, temp, hasUsed);
            temp.pop_back();
            hasUsed[i] = 0;
        }
    }
public:
    vector<string> permutation(string s) {
        sort(s.begin(), s.end());
        string temp;
        vector<int> hasUsed(s.size(), 0);
        backtracking(s, temp, hasUsed);
        return ans;
    }
};

Java

class Solution {
    private ArrayList<String> ret = new ArrayList<>();

    private void backtracking(char[] cs, StringBuffer temp, int[] hasUsed){
        if(temp.length() == cs.length){
            ret.add(temp.toString());
            return;
        }
        for(int i = 0; i < cs.length; i++){
            if(hasUsed[i] == 1) continue;
            //去重
            if(i > 0 && cs[i] == cs[i - 1] && hasUsed[i - 1] == 0) continue;

            hasUsed[i] = 1;
            temp.append(cs[i]);
            backtracking(cs, temp, hasUsed);
            temp.deleteCharAt(temp.length() - 1);
            hasUsed[i] = 0;
        }
    }
    public String[] permutation(String s) {
        char[] cs = s.toCharArray();
        Arrays.sort(cs);
        StringBuffer temp = new StringBuffer();
        int[] hasUsed = new int[cs.length];
        backtracking(cs, temp, hasUsed);
        //轉(zhuǎn)換為 String[] 型
        int n = ret.size();
        String[] ans = new String[n];
        for(int i = 0; i < n; i++){
            ans[i] = ret.get(i);
        }
        return ans;
    }
}
?? 運(yùn)行結(jié)果:

(搜索) 劍指 Offer 38. 字符串的排列 ——【Leetcode每日一題】,LeetCode,leetcode,算法,職場(chǎng)和發(fā)展

?? 復(fù)雜度分析:
  • 時(shí)間復(fù)雜度 O ( n ? n ! ) O(n*n!) O(n?n!),其中 n 為給定字符串的長(zhǎng)度。這些字符的全部排列有 O ( n ! ) O(n!) O(n!) 個(gè),每個(gè)排列平均需要 O ( n ) O(n) O(n)的時(shí)間來(lái)生成。
  • 空間復(fù)雜度 O ( n ) O(n) O(n),我們需要 O ( n ) O(n) O(n) 的??臻g進(jìn)行回溯,注意返回值不計(jì)入空間復(fù)雜度。。

題目來(lái)源:力扣。

放棄一件事很容易,每天能堅(jiān)持一件事一定很酷,一起每日一題吧!
關(guān)注我LeetCode主頁(yè) / CSDN—力扣專欄,每日更新!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-659842.html

注: 如有不足,歡迎指正!

到了這里,關(guān)于(搜索) 劍指 Offer 38. 字符串的排列 ——【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-每日一題【劍指 Offer 20. 表示數(shù)值的字符串】

    Leetcode-每日一題【劍指 Offer 20. 表示數(shù)值的字符串】

    ? 請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來(lái)判斷字符串是否表示 數(shù)值 (包括整數(shù)和小數(shù))。 數(shù)值 (按順序)可以分成以下幾個(gè)部分: 若干空格 一個(gè)? 小數(shù) ?或者? 整數(shù) (可選)一個(gè)? \\\'e\\\' ?或? \\\'E\\\' ?,后面跟著一個(gè)? 整數(shù) 若干空格 小數(shù) (按順序)可以分成以下幾個(gè)部分: (可選)一個(gè)符號(hào)

    2024年02月13日
    瀏覽(19)
  • 【LeetCode-中等】劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù)(詳解)

    【LeetCode-中等】劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù)(詳解)

    寫(xiě)一個(gè)函數(shù) StrToInt,實(shí)現(xiàn)把字符串轉(zhuǎn)換成整數(shù)這個(gè)功能。不能使用 atoi 或者其他類似的庫(kù)函數(shù)。 首先,該函數(shù)會(huì)根據(jù)需要丟棄無(wú)用的開(kāi)頭空格字符,直到尋找到第一個(gè)非空格的字符為止。 當(dāng)我們尋找到的第一個(gè)非空字符為正或者負(fù)號(hào)時(shí),則將該符號(hào)與之后面盡可能多的連續(xù)

    2024年02月15日
    瀏覽(25)
  • 替換空格&&反轉(zhuǎn)字符串中的單詞(LeetCode 劍指offer05 && 151)

    題目 劍指 Offer 05. 替換空格? 思路 遍歷,使用新的字符串來(lái)接原字符串,如為空格,則加入%20,否則加入原字符串。? 不過(guò)看了題解有另一種解法,由于空格轉(zhuǎn)化為%20,設(shè)計(jì)到原字符存儲(chǔ)空間的增加,因此先計(jì)算出需要增加的空間后。再使用雙指針,從后往前遍歷,這里畫(huà)的

    2024年02月16日
    瀏覽(19)
  • (其他) 劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù) ——【Leetcode每日一題】

    (其他) 劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù) ——【Leetcode每日一題】

    難度:中等 寫(xiě)一個(gè)函數(shù) StrToInt,實(shí)現(xiàn)把字符串轉(zhuǎn)換成整數(shù)這個(gè)功能。不能使用 atoi 或者其他類似的庫(kù)函數(shù)。 首先,該函數(shù)會(huì)根據(jù)需要丟棄無(wú)用的開(kāi)頭空格字符,直到尋找到第一個(gè)非空格的字符為止。 當(dāng)我們尋找到的第一個(gè)非空字符為正或者負(fù)號(hào)時(shí),則將該符號(hào)與之后面盡可

    2024年02月09日
    瀏覽(27)
  • (動(dòng)態(tài)規(guī)劃) 劍指 Offer 48. 最長(zhǎng)不含重復(fù)字符的子字符串 ——【Leetcode每日一題】

    (動(dòng)態(tài)規(guī)劃) 劍指 Offer 48. 最長(zhǎng)不含重復(fù)字符的子字符串 ——【Leetcode每日一題】

    難度:中等 請(qǐng)從字符串中找出一個(gè)最長(zhǎng)的不包含重復(fù)字符的子字符串,計(jì)算該最長(zhǎng)子字符串的長(zhǎng)度。 示例 1: 輸入: “abcabcbb” 輸出: 3 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 “abc”,所以其長(zhǎng)度為 3。 示例 2: 輸入: “bbbbb” 輸出: 1 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 “b”,所

    2024年02月11日
    瀏覽(26)
  • 劍指 Offer —— 數(shù)組和字符串

    劍指 Offer —— 數(shù)組和字符串

    在一個(gè) n * m 的二維數(shù)組中: 每一行都按照從左到右 非遞減 的順序排序 每一列都按照從上到下 非遞減 的順序排序 請(qǐng)完成一個(gè)高效的函數(shù),輸入這樣的一個(gè) 二維數(shù)組和一個(gè)整數(shù) ,判斷 數(shù)組中是否含有該整數(shù) 。 示例: 現(xiàn)有矩陣 matrix 如下: 給定 target = 5 ,返回 true 。 給定

    2023年04月24日
    瀏覽(29)
  • 第8天-代碼隨想錄刷題訓(xùn)練-字符串● 344.反轉(zhuǎn)字符串 ● 541. 反轉(zhuǎn)字符串II ● 劍指Offer 05.替換空格 ● 151.翻轉(zhuǎn)字符串里的單詞 ● 劍指Offer58-II.左旋轉(zhuǎn)字符串

    第8天-代碼隨想錄刷題訓(xùn)練-字符串● 344.反轉(zhuǎn)字符串 ● 541. 反轉(zhuǎn)字符串II ● 劍指Offer 05.替換空格 ● 151.翻轉(zhuǎn)字符串里的單詞 ● 劍指Offer58-II.左旋轉(zhuǎn)字符串

    LeetCode鏈接 編寫(xiě)一個(gè)函數(shù),其作用是將輸入的字符串反轉(zhuǎn)過(guò)來(lái)。輸入字符串以字符數(shù)組 s 的形式給出。 不要給另外的數(shù)組分配額外的空間,你必須原地修改輸入數(shù)組、使用 O(1) 的額外空間解決這一問(wèn)題。 swap常見(jiàn)的兩種交換形式 常見(jiàn)的值交換 通過(guò)位運(yùn)算 LeetCode鏈接 給定一個(gè)

    2024年02月04日
    瀏覽(23)
  • 劍指 Offer 20. 表示數(shù)值的字符串

    劍指 Offer 20. 表示數(shù)值的字符串 這是題目給出的定義,我們只需要按照題目給出的定義完成函數(shù)的編寫(xiě)即可 數(shù)值 (按順序)可以分成以下幾個(gè)部分: 若干空格 一個(gè) 小數(shù) 或者 整數(shù) (可選)一個(gè) \\\'e\\\' 或 \\\'E\\\' ,后面跟著一個(gè) 整數(shù) 若干空格 小數(shù) (按順序)可以分成以下幾個(gè)部分

    2024年02月06日
    瀏覽(22)
  • 劍指Offer--05替換空格&&58左旋字符串

    劍指Offer--05替換空格&&58左旋字符串

    題目是這樣的 意思是將字符串s中的空格替換為字符串\\\"%20\\\",如果只是替換一個(gè)字符還好,可以在原數(shù)組直接替換,但是是將空格替換為字符串,所以再在原數(shù)組上替換,原數(shù)組原內(nèi)容會(huì)被覆蓋,且長(zhǎng)度大小不夠,所以此時(shí)要?jiǎng)討B(tài)開(kāi)辟一個(gè)字符數(shù)組,這個(gè)數(shù)組開(kāi)多大?考慮最壞

    2024年02月06日
    瀏覽(22)
  • 劍指 Offer 20. 表示數(shù)值的字符串 (正則 逐步分解)

    請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來(lái)判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。 數(shù)值(按順序)可以分成以下幾個(gè)部分: 若干空格 一個(gè) 小數(shù) 或者 整數(shù) (可選)一個(gè) ‘e’ 或 ‘E’ ,后面跟著一個(gè) 整數(shù) 若干空格 小數(shù)(按順序)可以分成以下幾個(gè)部分: (可選)一個(gè)符號(hào)字符(‘+’

    2024年02月14日
    瀏覽(97)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包