面試100題系列之5字串的排列組合問題

2021-06-13 14:02:19 字數 1126 閱讀 4969

1、字串的組合

輸入乙個字串,找出字串中所有字元的所有組合形式。

比如說abcd,其組合形式有a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd。這裡認為adb和abd是一樣的情況。組合的情況也就是遇到乙個字元,分兩種情況,取當前這個字元,或者不取當前這個字元。然後對於每乙個字元都做這樣的考慮,典型的遞迴思路。

void range(char *a, int index, char *ans, int num)

range(a,index + 1,ans,num);//不取index位置上的字元

ans[num] = a[index];//取index位置上的字元

range(a,index + 1, ans, num + 1);

}

2、字串的排列

輸入乙個字串,找出字串中所有字元的所有排列形式。

比如說abc,其組合形式有abc,acb,bac,bca,cba,cab。這裡以乙個長一點的字串abcdefg為例,假設ab已經排好了,現在排c,那這c就可以在cdefg這幾個字元的任何乙個位置,也就是後面的任意乙個字元都可以出現在c的位置,進一步就是任意的交換c與後面字元的值都得到一種排列,這樣相當於第三個位置(也就是c本來的位置)上的字元就確定了就確定了,然後再對得到的序列的下乙個字元做同樣的操作。典型的用遞迴求解。

void rank(char *str, int b, int e)

for(i = b; i < e; ++i)

}

3、題目擴充套件:其實上面的思路是有bug的,為什麼呢?試試字串中有重複的字元,是不是得到了你想要的結果。解決的辦法有乙個,寫乙個函式移除重複的字元,或者如果不允許改變資料的話,就用另乙個字串來儲存那些不重複的字元。

4、最後給出上面的一些輔助函式以及main函式的額呼叫:

#include#includechar a[100];

char ans[100];

void print(char *ans, int num)

inline void swap(char &a, char &b)

int main()

}

微軟面試100題 左旋字串

定義字串的左旋操作 將字串前面的若干個字元移動到字串的尾部 如 abcde 左旋2位 cdeab 思路 ab ba cde edc baedc cdeab 分3部分反轉 public static void leftstr 1 stringbuilder str,int k private stat...

微軟100題(20)字串到整數的轉化

題目 輸入乙個表示整數的字串,把該字串轉換成整數並輸出。例如輸入字串 345 則輸出整數345 多考慮一些情況,如 345,前面有空格的,345 345前面有符號的,3 45,中間有非法字元的等等 bool valid true define int max int 0x7fffffff defin...

C primer plus 系列2 字串

1 將字串存在陣列中的兩種方法 2 如何在陣列中使用字串 3 cin只能讀取乙個單詞,讀到換行符認為字串結束 4 介紹cin.get cin.getline 1 將字串存在陣列中的兩種方法 int a 5 0 用來標記字串結尾 int a 5 food 稱為字串常量 2 在陣列中使用字串 inclu...