两个字符串之间的最短路径

时间:2015-10-24 20:34:40

标签: java shortest-path adjacency-matrix

我不得不做一个创建邻接矩阵的问题,找到用户输入的字符串之间的最短路径。我已经读取了充满字符串的数据文件,并且如果字符串之间的最短路径为1,则构建了邻接矩阵。如果最短的路径是2,3,4,5等,我很困惑如何做到这一点。判断字符串是否连接的方法是,如果第一个单词最后三个字符,两个字符或最后一个字符匹配第二个字符单词的前三个字符,前两个字符或前三个字符。

我给出的一个例子是"每天"和"白天"因为最后和前三场比赛。

如果最后两个和前两个匹配一个例子是"兄弟"和"橡皮擦"。

如果最后一个字符和第一个字符匹配的例子是" scorpion"和"晚上"。

    int i,j;
    String[] s = new String[sizOfFile];
int[][] a = new int[sizeOfFile][sizeOfFile]; 
for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        if((s[i].charAt(s[i].length()-3) == s[j].charAt(0) && s[i].charAt(s[i].length()-2) == s[j].charAt(1) && s                [i].charAt(s[i].length()-1) == s[j].charAt(2)))
            {
                a[i][j]=1;
            }
            else if(s[i].charAt(s[i].length()-1) == s[j].charAt(1) && s[i].charAt(s[i].length()-2) == s[j].charAt(0))
            {
                a[i][j]=1;
            }
            else if(s[i].charAt(s[i].length()-1) == s[j].charAt(0))
            {
                a[i][j]=1;
            }
            else
            {
                a[i][j]=0;
            }
            //Prints adjacency matrix
        }
    }

1 个答案:

答案 0 :(得分:0)

首先,要找到没有浪费精力的最短路径,您需要先进行广度优先搜索,而不是深度优先搜索。

E.g。为了说明我的意思,想象一下按名称搜索文件的目录。您搜索当前目录以及递归调用搜索方法的每个子目录。这是深度优先搜索,因为它会在继续之前搜索第一个子目录的完整层次结构,而这不是您想要的。

相反,收集所有子目录名称,然后如果尚未找到文件,则迭代列表以搜索每个子目录,收集子子目录列表,如果仍未找到文件,则重复使用new列表。

这就是你想要的。收集所有&#34; connected&#34;的所有单词的列表。对于当前单词,然后对于该列表中的每个单词,构建一个与这些单词相关的所有单词的新列表,并重复直到找到目标单词。

这是整体算法。搜索连接的单词应该通过将所有单词添加到TreeSet

来完成

对于每个后缀(1个,2个或3个字母),请致电subSet(suffix, nextSuffix),其中nextSuffixsuffix相同,但最后一个字符加1。

检查目标词的每个子集,如果找到则停止。

保留一个单独的HashSet到目前为止发现的used个单词,以防止无限循环,并防止使用较长路径到已使用较短路径找到的单词。删除used集中的子集中的任何字词。

将子集中未使用的单词添加到used集中,并且(与#34;路径&#34;单词一起移动到单词中)添加到下一次迭代时要处理的单词列表。

继续迭代直到完成,或者列表为空(找不到路径)。