找单词

标题:找单词 | 时间限制:1秒 | 内存限制:32768K | 语言限制:不限

一个字符串和一个二维字符数组,如果该字符串存在于该数组中,则按字符串的字符顺序输出字符串每个字符所在单元格的位置下标字符串,如果找不到返回字符串"N"。

1.需要按照字符串的字符组成顺序搜索,且搜索到的位置必须是相邻单元格,其中“相邻单元格”是指那些水平相邻或垂直相邻的单元格。
2.同一个单元格内的字母不允许被重复使用。
3.假定在数组中最多只存在一个可能的匹配。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String num = scanner.nextLine();
        char[][] words = new char[Integer.valueOf(num)][Integer.valueOf(num)];
        for (int i=0;i<Integer.valueOf(num);i++){
            String line = scanner.nextLine();
            String[] wordArray = line.split(",");
            for (int j=0; j<wordArray.length;j++){
                words[i][j] = wordArray[j].charAt(0);
            }
        }
        String word = scanner.nextLine();
        Set<String> curs = new LinkedHashSet<>();
        boolean isFind = canFind(words,word,Integer.valueOf(num),curs);
        if (!isFind){
            System.out.println("N");
        }else {
            StringBuilder sb = new StringBuilder();
            for (String cur:curs){
                if (!cur.isEmpty()){
                    String[] indexs =cur.split("\\+");
                    sb.append(indexs[0]).append(",").append(indexs[1]).append(",");
                }
            }
            sb.setLength(sb.length()-1);
            System.out.println(sb.toString());
        }
    }

    public static boolean canFind(char[][] words,String word,int num, Set<String> curs){
        char[] wordArray = word.toCharArray();
        for (int i=0;i<num;i++){
            for (int j=0;j<num;j++){
                if (find(words,wordArray,i,j,0,num,curs,"")){
                    return true;
                }
            }
        }
        return false;
    }
    public static boolean find(char[][] words, char[] wordArray,int i,int j, int k,int num, Set<String> curs,String cur){
        if (k==wordArray.length){
            return true;
        }
        if (!(0<=i&&i<num&&0<=j&&j<num)||words[i][j]=='!'){
            return false;
        }
        curs.add(cur);
        if (words[i][j]!=wordArray[k]){
            curs.remove(cur);
            return false;
        }
        words[i][j] ='!';
         cur=i+"+"+j;
        curs.add(cur);
        boolean isFind=find(words,wordArray,i-1,j,k+1,num,curs,cur)||find(words,wordArray,i+1,j,k+1,num,curs,cur)
        ||find(words,wordArray,i,j-1,k+1,num,curs,cur)||find(words,wordArray,i,j+1,k+1,num,curs,cur);
        words[i][j] =wordArray[k];
        return isFind;
    }
}

def get_res(grid, word):
    m, n, w = len(grid), len(grid[0]), len(word)

    def dfs(i, j, k):
        if not 0 <= i < m or not 0 <= j < n or grid[i][j] != word[k]:
            return False
        if k == w - 1:
            path.append((i, j))
            ans = list()
            for a, b in path:
                ans.extend([str(a), str(b)])
            print(",".join(ans))
            return True
        grid[i][j] = ""
        path.append((i, j))
        res = dfs(i + 1, j, k + 1) or dfs(i - 1, j, k + 1) or dfs(i, j - 1, k + 1) or dfs(i, j + 1, k + 1)
        grid[i][j] = word[k]
        path.remove((i, j))
        return res

    for i in range(m):
        for j in range(n):
            if dfs(i, j, 0):
                return True
    return False


while True:
    try:
        row = int(input())
        grid = [input().split(",") for _ in range(row)]
        word = input()
        path = list()
        if not get_res(grid, word):
            print("N")
    except:
        break //190




全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务