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