巧用遞歸求字符串的子集

集合中的所有元素對於每一個子集來說,都有兩種可能性:在子集中或是不在子集中。

各個元素的這兩種可能性組合起來,組成了一個集合的所有子集。這也是每一個集合都有2^n個子集的原因所在。

比如 char *str = "abcd";對於str這個單詞集合,其一個子集 空集,就是所有元素都不在該子集中,再如”abc”,這個子集,是元素a,b,c在子集中,元素d不在子集中。

我們把元素這種在或不在子集中狀態,防止一個bool數組中。

根據這一點,利用遞歸求出一個元素集合的子集。
用C++實現的代碼如下:

#include <iostream>

void get_Subset(char *str,int start,int end,bool *flags)
{
    if(start == end)
    {
        int i = 0;
        for(;i < end;i++)
        {
            if(flags[i])
                putchar(str[i]);
        }
        puts("");
        return;
    }
    else
    {
        flags[start] = false;
        get_Subset(str,start + 1,end,flags);
        flags[start] = true;
        get_Subset(str,start + 1,end,flags);

    }
}
int main()
{
    char *str = "abcd";
    bool flags[4] = {0};
    get_Subset(str,0,4,flags);
    return 0;
}

上面代碼中的核心是這四句代碼:

        flags[start] = false;
        get_Subset(str,start + 1,end,flags);
        flags[start] = true;
        get_Subset(str,start + 1,end,flags);

flags[start] = false;代表數組中索引爲start的元素不在該子集中,而後進入遞歸,元素索引向後加一,同樣索引爲start+1的元素也有在或者不在該子集中兩種可能性,當start==end時,即集合中的所有元素都已經闡明瞭在或者不在該子集中,輸出該子集後,return跳出該層遞歸。
而後flags[start] = true;代表數組中索引start的元素在該子集中,而後進入遞歸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章