全排列延伸編程題目

問題描述

拉姆剛剛開始學習英文字母,並已經注意有趣的單詞陣列。他想確定他是否能將最足單詞排列在一個列表中,使得改列表中任何單詞的首字母與其前面單詞的尾字母相同。你能編寫一個計算機程序來幫助拉姆嗎?

類WordListOrder的方法canArrangesWords的輸入應包含一個單詞數組arr

如果列表中單詞可按照要求的方式排列,返回1,否則,返回-1.在這種排列中,第一個單詞的首字母和最後一個單詞的尾字母可以爲任意字母,不需要滿足約束條件。

算法思路:對字符串數組進行全排列,得到一個排序時掃描字符數組檢查是否符合條件


public class WordListOrder {
    public static void canArrangeWords(String []arr,int start,int len){
        if(start==len-1){
            int i=1;
            for(;i<len;i++){
                if(arr[i-1].charAt(arr[i-1].length()-1)!=arr[i].charAt(0))
                   break;
            }
            if(i==len){
                for(String str:arr){
                    System.out.print(str+" ");
                }
                System.out.println();
                flag=true;
            }
        }
        else{
            for(int i=start;i<len;i++){
                swap(arr,start,i);
                canArrangeWords(arr,start+1,len);
                swap(arr,start,i);
            }
        }

    }
    public static boolean flag;
    public static void swap(String[] arr,int i,int j){
        String temp=new String();
        temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }

    public static void main(String[] args) {
        String [] arr={"1","2","3"};
        canArrangeWords(arr,0,arr.length);
        System.out.println(flag);
        // TODO Auto-generated method stub

    }
}

遞歸過程的空間擴展
全排列的遞歸算法從上面空間擴展的圖就可以看出來
- 每層循環針對一個元素,把這個元素和它後面的元素調換一次位置(包含自身),再展開對下一個元素的循環。展開完之後再調換回來。
-可以觀察到每層循環的arrange(str,start,len)都是一樣的。

現在看來我是懂了,不知道下次再看我能不能敲出代碼,時常鞏固基礎。
參考博客
全排列算法
相同問題的巧妙C++實現

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