字符串組合函數模板

            網絡整理 分享 時間: 收藏本文

            字符串組合函數模板

            在日常學習、工作或生活中,大家總少不了接觸作文或者范文吧,通過文章可以把我們那些零零散散的思想,聚集在一塊。范文怎么寫才能發揮它最大的作用呢?接下來小編就給大家介紹一下優秀的范文該怎么寫,我們一起來看一看吧。

            字符串組合函數篇一

            題目:輸入一個字符串,輸出該字符串中字符的所有組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。

            上面我們詳細討論了如何用遞歸的思路求字符串的排列。同樣,本題也可以用遞歸的思路來求字符串的組合。

            假設我們想在長度為n的字符串中求m個字符的組合。我們先從頭掃描字符串的第一個字符。針對第一個字符,我們有兩種選擇:第一是把這個字符放到組合中去,接下來我們需要在剩下的n-1個字符中選取m-1個字符;第二是不把這個字符放到組合中去,接下來我們需要在剩下的n-1個字符中選擇m個字符。這兩種選擇都很容易用遞歸實現。下面是這種思路的參考代碼:

            #include#include#includeusing namespace std;#includevoid combination(char *string ,int number,vector&result);void combination(char *string){ assert(string != null); vectorresult; int i , length = strlen(string); for(i = 1 ; i <= length ; ++i) combination(string , i ,result);}void combination(char *string ,int number , vector&result){ assert(string != null); if(number == 0) { static int num = 1; printf("第%d個組合t",num++); vector::iterator iter = (); for( ; iter != () ; ++iter) printf("%c",*iter); printf("n"); return ; } if(*string == ') return ; _back(*string); combination(string + 1 , number - 1 , result); _back(); combination(string + 1 , number , result);}int main(void){ char str[] = "abc"; combination(str); return 0;}

            由于組合可以是1個字符的組合,2個字符的字符……一直到n個字符的組合,因此在函數void combination(char* string),我們需要一個for循環。另外,我們用一個vector來存放選擇放進組合里的`字符。

            用位運算來實現求組合

            #includeusing namespace std;int a[] = {1,3,5,4,6};char str[] = "abcde";void print_subset(int n , int s){ printf("{"); for(int i = 0 ; i < n ; ++i) { if( s&(1<<i) ) ? // 判斷s的二進制中哪些位為1,即代表取某一位 printf("%c ",str[i]); //或者a[i] } printf("}n");}void subset(int n){ for(int i= 0 ; i < (1<<n) ; ++i) { print_subset(n,i); }}int main(void){ subset(5); return 0;}

            全組合

            例如給定字符串“abc”,全組合意思從中去0個元素,1個元素,一直到n個元素,介紹二進制做法。以字符串“abc”為例:

            000 <---> null

            001 <---> c

            010 <---> b

            011 <---> bc

            100 <---> a

            101 <---> ac

            110 <---> ab

            111 <---> abc

            思路出來了,代碼也比較好寫,分享一下我的代碼:

            /** ?* write a method that returns all subsets of a set ?*/ ? #include#include#include/** ?* 通過0到2^-1來標識子集 ?* ?* t = (n * 2^n) ?* ?*/ ?void getsubset(char *str, int len) ?{ ? int i, max, index, j; ? ?max = 1 << len; ? ?for (i = 1; i < max; i ++) { ? ?j = i; ? ?index = 0; ? ? while (j) { ? ? if (j & 1) { ? ? ?printf("%c", str[index]); ? ? } ? ? j >>= 1; ? ? index ++; ? ?} ? ?printf("n"); ? } ?} ? int main(void) ?{ ? char str[1000]; ? ?while (scanf("%s", str) != eof) { ? ?getsubset(str, strlen(str)); ? ?} ? ?return 0; ?}

            從n中選m個數

            這里分為兩種方法:遞歸和回溯

            遞歸

            遞歸思路如下,從n個數中取出m個數,可以分解為以下兩步:

            從n個數中選取編號最大的數,然后在剩下的n-1個數中選取m-1個數。直到從n-(m-1)中選取一個數為止 從n個數中選取次小的數,重復1的操作

            代碼如下:

            /** ?* 遞歸法解決組合問題 ?*/ ?void combine(int *arr, int n, int m, int *tmp, const int m) ?{ ? int i, j; ? ?for (i = n; i >= m; i --) { ? ?tmp[m] = i; ? ?if (m == 0) { // 選出m個數 ? ? for (j = 0; j < m; j ++) { ? ? ?printf("%d ", arr[tmp[j]]); ? ? } ? ? printf("n"); ? ?} else { ? ? combine(arr, i - 1, m - 1, tmp, m); ? ?} ? } ?}

            dfs

            其實考慮到用dfs,這道題目就簡單很多,dfs的回溯條件就是臨時數組的大小==k即可,同時附加一道leetcode上的題目,用dfs思路ac

            題目

            given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

            for example,

            if n = 4 and k = 2, a solution is:

            ac代碼

            public class solution { ? public static arraylist

            combine(int n, int k) { ? ?arraylist

            rs = new arraylist

            (); ? ?arraylistlist = new arraylist(); ? ? ? dfs(1, k, n, list, rs); ? ? ? return rs; ? } ? ? public static void dfs(int pos, int k, int n, arraylistlist, arraylist

            rs) { ? ?if (() == k) { ? ? (new arraylist(list)); ? ?} ? ? ? for (int i = pos; i <= n; i ++) { ? ? (i); ? ? dfs(i + 1, k, n, list, rs); ? ? (() - 1); ? ?} ? } ?}

            s("content_relate");

            【關于字符串的組合算法問題的c語言實現攻略】相關文章:

            1.

            pid算法的c語言實現

            2.

            c語言中壓縮字符串的算法

            3.

            c語言中實現kmp算法實例

            4.

            c語言字符串快速壓縮算法代碼

            5.

            希爾排序算法的c語言實現示例

            6.

            關于c語言約瑟夫問題輸出序號算法

            7.

            c語言字符串操作函數和常用的實現

            8.

            c語言中返回字符串函數的實現方法

            主站蜘蛛池模板: 亚洲一区二区三区播放在线| 亚洲国产日韩一区高清在线| 国产乱人伦精品一区二区| 亚洲熟女www一区二区三区| 国产亚洲情侣一区二区无| 中文激情在线一区二区| 国产精品久久久久久一区二区三区| 国产精品va一区二区三区| 精品一区二区三区免费视频| 精品国产一区二区三区av片| 无码一区18禁3D| 亚洲国产AV一区二区三区四区| 无码人妻AV免费一区二区三区| 国偷自产Av一区二区三区吞精| 变态调教一区二区三区| 精品人妻一区二区三区四区在线| 无码国产精品一区二区高潮| 国产精品无码一区二区在线| 亚洲欧美日韩中文字幕在线一区| 99精品一区二区三区无码吞精| 麻豆AV一区二区三区| 日本激情一区二区三区| 中文字幕一区二区三区在线观看 | 国产亚洲情侣一区二区无| 视频一区二区在线观看| 日韩精品一区二区三区影院| 一区二区三区视频免费| 夜夜嗨AV一区二区三区| 日韩一区二区超清视频| 午夜DV内射一区区| 99久久人妻精品免费一区 | 精品一区二区三区在线观看l| 无码一区二区三区视频| 久久一区二区三区免费播放| 一区二区三区四区精品视频| 99无码人妻一区二区三区免费| 国产精品亚洲一区二区在线观看| 亚洲欧美成人一区二区三区| 大香伊人久久精品一区二区 | 污污内射在线观看一区二区少妇 | 免费精品一区二区三区在线观看|