Java字搜索算法

时间:2011-05-04 21:30:20

标签: java algorithm

我有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”),并且列表的长度没有设置大小。它就像一个单词搜索,所以单词可以在同一行,不同行上的不同字母等。我将如何以编程方式执行此操作?我很确定我必须制作一个方法并在方法中调用自己,但我不知道如何做到这一点。谢谢你的时间!

2 个答案:

答案 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个对象标识该列表中的listindex

  • 在构建时我构建了一个Map,其中键是字符,值是Position个对象的列表,每个对象告诉我哪个列表和该列表中的哪个索引我可以找到

  • 找到单词后,我只需扫描单词字符,然后在Position

  • 中检索该字符的第一个可用Map
  • 您可以轻松修改findWord方法以返回所有可能的组合

  • 您可以轻松添加方法,使用现有列表中的附加字符串或新列表更新内部Map

  • 复杂性:初始化为O(n ^ 2)(必须扫描字符串列表列表);找到一个单词是O(n)