最后一封信第一封信

时间:2017-12-12 13:41:45

标签: recursion backtracking

我想对字符串数组进行排序。 一个单词必须以前一个单词的最后一个字母开头

example1 :
358 123 874 826 638 ===> ok

我们有可能的解决方案:12 3 3 5 8 8 2 6 6 3 8 8 74

example2 :
521 894 189 577 400 ==> no solution 

这是一个回溯问题。 我试着用java解决这个问题:

 package lastfirst;
 public class LastFirst {
 public static int sol[] = {-1,-1,-1,-1,-1};      
 public static int pos=0;
 public static boolean trouve(int sol[],int j){
for(int i=0;i<sol.length;i++)
    if(sol[i]==j) return true;
        return false;  
  }

 public static boolean ok(String t[],int sol[],int j){ 
     if(sol[sol.length-1]==-1)
         return true;
     else
     {
       String ch1=t[sol[sol.length-1]];
       String ch2=t[j];  
       return ch1.charAt(ch1.length()-1)==ch2.charAt(0); 
     }   
    }
  public static boolean solve(String[]t){
int i=0;
if(i==t.length)// Solution found, all words are used 
    return true;
   while(i<t.length)
   {
    if( !trouve(sol,i))// if the word is not used yet
        {
            if(ok(t,sol,i))// if the word is compatible with the solution
                {
                    sol[pos]=i;// Place word into solution table 
                    pos++;
                    solve(t);// Recursive call

                    pos--;  
                }
        }
    i++;
    }
return false;// if no solution is found
  }

public static void main(String[] args) {
    String t[] = {"358", "123", "874" , "826","638"};
    //la solution existe :123 358 826 638 874
    System.out.print(solve(t));
   }


  }

1 个答案:

答案 0 :(得分:0)

这是在Python中。这里的第一个search函数有2个参数words:尚未搜索的字符串数组的子集。 last是指我们正在检查的当前可能解决方案中使用的最后一个字符串,默认为None或java中的null

在第一个for循环中,words中的每个字符串都尝试成为解决方案中的第一个字符串。如果words中的其余字符串(即words[:w]+words[w+1:])确实返回了一个解决方案(从我们递归调用search,在if ans!=None中检入),我们将该字符串添加到返回解决方案的前面并返回数组。如果失败,则返回None,我们尝试下一个字符串。如果他们都没有找到解决方案,我们会在最后一行返回None来表示失败。

def search(words,last=None):
    if not words: return []
    for w in range(len(words)):
        if not last or words[w][0]==last[-1]:
            ans = search(words[:w]+words[w+1:],words[w])
            if ans!=None: return [words[w]]+ans

    return None

words = "94 521 189 577 405".split()
print(search(words))

输出:['521', '189', '94', '405', '577']