我有List<List<String>>
字符串是单个字符。
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”),并且列表的长度没有设置大小。它就像一个单词搜索,所以单词可以在同一行,不同行上的不同字母等。我将如何以编程方式执行此操作?我很确定我必须制作一个方法并在方法中调用自己,但我不知道如何做到这一点。谢谢你的时间!
答案 0 :(得分:3)
最简单(不是最有效)的方法是搜索单词的第一个字母。然后在那个单词周围搜索第二个字母。如果你找到一个匹配,继续进入那个方向(逻辑应该很容易。)当你完成这个单词,得到一个错误的字母或者碰到董事会的边缘时停止。
你能为自己做的最好的事情是创建一个方法,为给定的X,Y坐标返回一个字符(或一个字符串,无论如何)。它可能会做这样的事情:
char charAt(int x, int y) {
return list.get(x).get(y).charAt(0);
}
答案 1 :(得分:0)
如果您从List<List<String>>
构建适当的内部数据结构,也可以搜索具有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 + "]";
}
}
}
"bob"
的输出:
Position [list=0, index=3]
Position [list=1, index=4]
Position [list=0, index=3]
注意:
Position
个对象标识该列表中的list
和index
在构建时我构建了一个Map
,其中键是字符,值是Position
个对象的列表,每个对象告诉我哪个列表和该列表中的哪个索引我可以找到
找到单词后,我只需扫描单词字符,然后在Position
Map
您可以轻松修改findWord
方法以返回所有可能的组合
您可以轻松添加方法,使用现有列表中的附加字符串或新列表更新内部Map
复杂性:初始化为O(n ^ 2)(必须扫描字符串列表列表);找到一个单词是O(n)