Java单词搜索算法
我有一个Java单词搜索算法,java,algorithm,Java,Algorithm,我有一个列表,其中字符串是单个字符 List { List { |"r","x","f","b","e","a","r" } List { |"a","r","q","b","o","y","t" } List { |"s","q","z","b","s","b","r" } } 所以我想在这个列表中找到一个单词(即“bob”),列表的长度没有设置大小。这就像一个单词搜索,所以单词可以在同一行,不同的字母在不同的行,等等。我该如何通过编程实现这一点?我非常确定我将必须创
列表
,其中字符串是单个字符
List {
List {
|"r","x","f","b","e","a","r"
}
List {
|"a","r","q","b","o","y","t"
}
List {
|"s","q","z","b","s","b","r"
}
}
所以我想在这个列表中找到一个单词(即“bob”),列表的长度没有设置大小。这就像一个单词搜索,所以单词可以在同一行,不同的字母在不同的行,等等。我该如何通过编程实现这一点?我非常确定我将必须创建一个方法并在该方法中调用自身,但我不确定如何实现这一点。谢谢你的时间 最简单(不是最有效)的方法是搜索单词的第一个字母。然后在该单词周围搜索第二个字母。如果你找到一个匹配的,继续朝那个方向走(逻辑应该很简单。)当你完成这个单词,得到一个错误的字母,或者碰到黑板边缘时停止
你能为自己做的最好的事情就是为给定的X,Y坐标创建一个返回字符(或字符串,无论什么)的方法。它可能会这样做:
char charAt(int x, int y) {
return list.get(x).get(y).charAt(0);
}
如果从
列表
中构建适当的内部数据结构,则还可以搜索复杂度为O(n)的单词。下面是一个例子:
public class SO5890087 {
Map<Character, List<Position>> pmaps =
new HashMap<Character, List<Position>>();
public static void main(String[] args) {
String[][] strings = new String[][] {
{ "r", "x", "f", "b", "e", "a", "r" },
{ "a", "r", "q", "b", "o", "y", "t" },
{ "s", "q", "z", "b", "s", "b", "r" } };
List<List<String>> sss = new ArrayList<List<String>>();
for (int i = 0; i < strings.length; i++)
sss.add(new ArrayList<String>(Arrays.asList(strings[i])));
SO5890087 finder = new SO5890087(sss);
List<Position> positions = finder.findWord("bob");
for (Position position : positions)
System.out.println(position);
}
public SO5890087(List<List<String>> sss) {
for (int i = 0; i < sss.size(); i++) {
List<String> ss = sss.get(i);
for (int j = 0; j < ss.size(); j++) {
Character c = ss.get(j).charAt(0);
if (! pmaps.containsKey(c))
pmaps.put(c, new ArrayList<Position>());
pmaps.get(c).add(new Position(i, j));
}
}
}
public List<Position> findWord(String word) {
List<Position> result = new ArrayList<Position>();
char[] cs = word.toCharArray();
for (int i = 0; i < cs.length; i++) {
if (pmaps.containsKey(cs[i])) {
result.add(pmaps.get(cs[i]).get(0));
}
else {
result.clear();
break;
}
}
return result;
}
class Position {
int list;
int index;
public Position(int list, int index) {
this.list = list;
this.index = index;
}
public int getList() {
return list;
}
public int getIndex() {
return index;
}
@Override
public String toString() {
return "Position [list=" + list + ", index=" + index + "]";
}
}
}
注:
对象标识该列表中的位置
和列表
索引
- 在构建时,我构建了一个
,其中键是字符,值是映射
对象的列表,每个对象告诉我在哪个列表中可以找到该字符,以及在该列表中可以找到哪个索引位置
- 查找单词时,我只需扫描单词字符,然后在我的
地图中检索该字符的第一个可用
位置
- 您可以轻松修改
方法以返回所有可能的组合findWord
- 您可以轻松添加方法,使用现有列表中的附加字符串或新列表更新内部
映射
- 复杂性:初始化为O(n^2)(必须扫描字符串列表);找到一个单词是O(n)
|
的意思?你的意思是,这个列表代表了一个字母网格,就像你在小报和超级市场女性杂志之间的文字搜索问题书中所说的那样?etc省略了一些重要的细节。我们是否可以从外部列表
中假设内部列表
的顺序是重要的?据推测,单词中的连续字母必须出现在相同或相邻的子列表中;但相对顺序是否可以颠倒?同样,我们是否要假设内部列表中的字母顺序也很重要?@delnan它是伪代码,|只是一个视觉助手,它没有目的@eggyal你的想法绝对正确,规则与常规单词搜索相同。我唯一要补充的是,当你“四处搜索”和“继续前进”时,你需要测试边缘。@Ted Hopp-第一段,最后一句,最后一句“或击中董事会的边缘。”:-)你是对的。我在考虑“四处搜索”部分——它似乎只适用于“继续前进”部分。@Ted说得对。我本来可以说得更清楚的。在任何情况下,我都希望实现它的任何人都能很快发现并意识到如何克服这一点。有了这个方法就更容易了,因为你可以在那里检查长度。信息隐藏再次获胜。
Position [list=0, index=3]
Position [list=1, index=4]
Position [list=0, index=3]