1. 程式人生 > >程式設計題—字串的排列

程式設計題—字串的排列

內容會持續更新,有錯誤的地方歡迎指正,謝謝!

題目

題目描述:
輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

分析

一下子想不出解決方案就舉例+畫圖+分解!

這裡寫圖片描述

如圖所示,便是我們的思路。

所以,求所有字元的排列的步驟:
1.求出所有可能出現在第一個位置的字元,即把第一個字元依次和後面的每個字元交換。
2.固定第一個字元,求剩下的所有字元的排列

看到沒,開始遞迴了。

遞迴實現的程式碼

class Solution {
private:
    vector<string> res;
public:
    void Permu(string str,int begin)
    {
        int sSize=str.size();
        //begin指向當前執行排列的字串的第一個字元(即“名義上的第一位”),直到begin指向字串的末尾
        if(begin==sSize)
        {
            res.push_back(str);
            return;
        }
        for
(int i=begin;i<sSize;++i) { //若要交換的字元相同就跳過,因為i和begin相等時已計算過此種情況了,否則會重複輸出部分結果。 if(i==begin||str[i]!=str[begin]) //等價於if(i!=begin&&str[i]==str[begin]) { swap(str[i],str[begin]);//<algorithm>標頭檔案裡的交換函式,用於“名義上的第一位”和後面某一位交換 //將“名義上的第一位”固定住,再對剩下的元素進行排列操作,人腦跑遞迴時,可先忽略遞
//歸呼叫,先執行for迴圈,再針對每次for迴圈的結果,將遞迴函式看成求解這種情況的一 //個方法,這個方法又會呼叫這個方法,直到滿足前面的結束條件便輸出一個字串。 Permu(str,begin+1);//不能用++begin和begin++ } } } vector<string> Permutation(string str) { int sSize=str.size(); if(sSize!=0) Permu(str,0); return res; } };

呼叫next_permutation實現的程式碼

在STL裡,next_permutation(str.begin(),str.end())是求出下一個排列組合,而prev_permutation(str.begin(),str.end())是求出上一個排列組合。所謂“下一個”和“上一個”。

雖然最後一個排列理論上沒有下一個排列,且next_permutation會返回false,但此時使用了這個next_permutation方法後,序列會變成字典序列的第一個,如cba變成abc。prev_permutation同理。

next_permutationprev_permutation求排列組合問題很方便,但是要記得包含標頭檔案#include <algorithm>

class Solution//預設引入了<algorithm>
{
private:
    vector<string> res;
public:
    vector<string> Permutation(string str)
    {
        int sLength=str.size();
        if(sLength==0)
            return res;
        sort(str.begin(),str.end());
        do//do-while迴圈和next_permutation、prev_permutation更配喔~
        {
            res.push_back(str);
        }while(next_permutation(str.begin(),str.end()));
        //next_permutation()執行一次 當前的str序列abc 就變成了 升序中的下一個str序列acb
        //當 當前的str序列 是 最後一種str序列cba ,那麼它就會變成最初的str序列abc

        return res;
    }
};

補充兩道簡單的練手題:

1.dceb的下一個序列分別是什麼呢?

解答:用一次next_permutation就解決了!

2.dceb的上一個序列分別是什麼呢?

解答:用一次prev_permutation就解決了!

相關推薦

程式設計字串排列

內容會持續更新,有錯誤的地方歡迎指正,謝謝! 題目 題目描述: 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述: 輸入

摩拜 [程式設計] 字串問題

小摩手裡有一個字串A,小拜的手裡有一個字串B,B的長度大於等於A,所以小摩想把A串變得和B串一樣長,這樣小拜就願意和小摩一起玩了。 而且A的長度增加到和B串一樣長的時候,對應的每一位相等的越多,小拜就越喜歡。比如"abc"和"abd"對應相等的位數為2,為前兩位。 小摩可以在A的開頭或者

快手[程式設計] 字串歸一化

通過鍵盤輸入一串小寫字母(a~z)組成的字串。 請編寫一個字串歸一化程式,統計字串中相同字元出現的次數,並按字典序輸出字元及其出現次數。 例如字串"babcc"歸一化後為"a1b2c2" 輸入描述: 每個測試用例每行為一個字串,以'\n'結尾,例如cccddecca 輸出描

程式設計 字串A在字串B中出現的次數

騰訊筆試題之一,過了70%,超時。 輸入:整數k, 字串a,字串b 輸出:字串a中k個字元在b出現的次數。 int main(){ int k; string a; string b; set<string> tempset;

[程式設計] 字串轉換成整數

劍指Offer中的小題目。 字串轉換成整數。需要考慮到非數字符號、正負號、最大正整數、最小正整數、溢位以及錯誤處理。 #include "stdafx.h" #include<iostream> #include<stdlib.h> us

(網易2018校招筆試)[程式設計] 字串碎片

一個由小寫字母組成的字串可以看成一些同一字母的最大碎片組成的。例如,”aaabbaaac”是由下面碎片組成的:’aaa’,’bb’,’c’。牛牛現在給定一個字串,請你幫助計算這個字串的所有碎片的平均長度是多少。 輸入描述: 輸入包括一個字串s,字串s的長度l

c語言除法如何保留小數,如何printf小數 [程式設計] 字串碎片

#include<stdio.h> #include<string.h> char str[51]; int n,count,i; int main() {     scanf("%s",&str);     n=strlen(str);  

網易2018[程式設計] 字串碎片

時間限制:1秒 空間限制:32768K 一個由小寫字母組成的字串可以看成一些同一字母的最大碎片組成的。例如,"aaabbaaac"是由下面碎片組成的:'aaa','bb','c'。牛牛現在給

[程式設計] 字串編碼

給定一個字串,請你將字串重新編碼,將連續的字元替換成“連續出現的個數+字元”。比如字串AAAABCCDAA會被編碼成4A1B2C1D2A。 輸入描述: 每個測試輸入包含1個測試用例 每個測試用例

網易[程式設計] 字串碎片

一個由小寫字母組成的字串可以看成一些同一字母的最大碎片組成的。例如,"aaabbaaac"是由下面碎片組成的:'aaa','bb','c'。牛牛現在給定一個字串,請你幫助計算這個字串的所有碎片的平均長度是多少。輸入描述:輸入包括一個字串s,字串s的長度length(1 ≤ length ≤ 50),s只含小寫

劍指offer程式設計(JAVA實現)——第27字串排列

github https://github.com/JasonZhangCauc/JZOffer import java.util.ArrayList; import java.util.Collect

程式設計:統計字串中字元出現的次數

1. from collections import Counter string = '1212ababABAB' s = Counter(string) print(s) 2. string = '1212ababABAB' s = {x: string.count(x

程式設計:將字串間多個空格變為1個空格

解法一: char str[]="how are you "; int i=0,j=0; //其中\0表示字串結束 while(str[j]!='\0'){ if(str[j]!=' '){ str[i++]=str[j++]; }

程式設計】基本字串壓縮

[程式設計題]基本字串壓縮 熱度指數:58188 時間限制:3秒 空間限制:32768K 利用字元重複出現的次數,編寫一個方法,實現基本的字串壓縮功能。比如,字串“aabcccccaaa”經壓縮會變成“a2b1c5a3”。若壓縮後的字串沒有變短,則返回原先的字串。 給定一

牛客網字串排序程式設計

let resultArr = [] while(lines = readline()) { resultArr.push(changeString(lines)) } console.log(resultArr.join("\n")) function changeString(str

PTA - C程式設計 NoB - 字串 (12道

7-1 統計大寫子音字母 7-2 統計字元出現次數 7-3 字串逆序 7-4 字串字母大小寫轉換 7-5 查詢指定字元

【演算法】網易程式設計:暗黑字串組合數

題目 一個字串僅由’A’,’B’,’C’三個字元組成,若字串中不存在’A’,’B’,’C’三個字元相鄰的子串(比如ABC,BAC等),則該字串稱為暗黑字串,否則稱為單純字串。 求長度為L的此種字串中有多少種是暗黑字串? 例子: 字串 AABBA

華為線上程式設計系列-14-字串的連線最長路徑查詢

問題描述: 1. 問題涉及知識點. string型別排序 有重複 優先佇列 PriorityQueue. 2. 自己解法. 解法一:按照排序的思想直接對比字元的大小.或者使用s

[程式設計]倒置字串

將一句話的單詞進行倒置,標點不倒置。比如 I like beijing. 經過函式後變為:beijing. like I輸入描述:每個測試輸入包含1個測試用例: I like beijing. 輸入用例

字串程式設計一道

編寫一個擷取字串的函式,輸入為一個字串和位元組數,輸出為按位元組擷取的字串。但是要保證漢字不被截去半個,列如“人ABC”4應該擷取為“人AB”,輸入“人ABC們DEF”6,應該輸出“人ABC”而不是“人