我想对字符串数组进行排序。 一个单词必须以前一个单词的最后一个字母开头
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));
}
}
答案 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']