我试图找出如何以递归方式搜索char数组中的单词,如果它存在或不存在则返回。可以把它想象成一个单词搜索的编程。我目前的代码如下。种子值9999有助于测试。如何编写递归搜索方法来验证任何给定单词在char数组中的存在?
public class Board {
private char[][] board = new char[4][4];
private boolean[][] visited = new boolean[4][4];
private String word;
public Board(int seed){
word = "";
Random rand = new Random(seed);
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
char randomChar = (char) (rand.nextInt(27) + 65);
//System.out.print(" " + randomChar + " ");
board[i][j] = randomChar;
//System.out.print(board[i][j]);
}//System.out.println();
}
}
public void resetBoard(){
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
visited[i][j] = false;
}
}
}
public void printBoard(){
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(j == 0)
System.out.println("+---+ +---+ +---+ +---+");
System.out.print("| " + board[i][j] + " | ");
}
System.out.println("\n+---+ +---+ +---+ +---+");
}
}
public boolean verifyWord(String w){
this.word = w;
for(int i = 0; i < w.length(); i++){
// char letter = w.charAt(i);
// System.out.println(letter);
boolean wordVerify = verifyWordRecursively(0, 0, 0);
if(wordVerify == true)
return true;
// if(i == w.length() - 1){
// if(wordVerify == true)
// return true;
// }
}return false;
}
public boolean verifyWordRecursively(int wordIndex, int row, int col){
char letter = word.charAt(wordIndex);
System.out.println(letter);
if(board[row][col] == letter){
return true;
}
else{
if(col + 1 < board[0].length){
verifyWordRecursively(wordIndex, row, col + 1);
}
if(row + 1 < board.length){
verifyWordRecursively(wordIndex, row + 1, col);
}
}return false;
}
}
这是我的主要课程:
public class LA2Main {
public static void main(String[] args) throws IOException{
int seed = getSeed();
Board b = new Board(seed);
b.printBoard();
Scanner inFile = new Scanner(new FileReader("input.txt"));
// while(inFile.hasNextLine()){
// System.out.println(inFile.nextLine());
String word = inFile.nextLine();
b.resetBoard();
System.out.println("-----------------------\n" + word);
boolean isVerified = b.verifyWord(word);
if(isVerified == true)
System.out.println("'" + word + "' was found on the board!");
else
System.out.println("'" + word + "' is NOT on this board");
b.printBoard();
// }
}
public static int getSeed(){
Scanner sc = new Scanner(System.in);
int userInput;
while(true){
try{
System.out.println("Enter an integer seed value greater than 0: ");
userInput = Integer.parseInt(sc.next());
if( userInput > 0)
return userInput;
}
catch(NumberFormatException e){
System.out.println("Invalid!");
}
}
}
}
答案 0 :(得分:1)
在char数组中找到单词的最简单方法可能是首先将其转换为String
,然后使用contains
作为下一个,无需重新发明轮子:
boolean contains = new String(myCharArray).contains(myWord);
这是最基本的方式,case sensitive
如果该单词只是更大词的子部分,则会返回true
,所以更合适的方法是使用matches
和一个不区分大小写的正则表达式来定义单词边界,如下所示:
boolean contains = new String(myCharArray).matches(
String.format("(?i)^.*\\b%s\\b.*$", Pattern.quote(myWord))
);
答案 1 :(得分:0)
所以我猜这个问题是一个递归的字符串匹配,虽然前面指出可能不是最好的方法,但仍然可以使用。
查看代码,您不希望匹配char数组,而是匹配char矩阵。让我们采取天真的方法,因为我们无论如何都处于低效的道路上。
我将给出一些伪代码,让我们从一些代码开始,检查矩阵是否与某个偏移处的数组匹配:
function matches(char matrix[][], char needle[], int row, int col)
width, height = dimensions(matrix)
/* Check whether we're out of range */
if (width * height < row * width + col + length(needle)) {
return false
}
for (int i = 0 ... len(needle)) {
if (matrix[row][col] != needle[i]) {
return false
}
/* increment position, (hint: integer division) */
row += (col + 1) / width
col = (col + 1) % width
}
return true
现在这仍然不是递归解决方案,并且该函数有很多参数(对于代码清晰度不太好)。让我们先写一个包装器:
function matches(char matrix[][], char needle[])
recursiveMatches(matrix, needle, 0, 0)
recursiveMatches必须跟踪它的原始行和列, 做一个正确的递归调用。当然,它需要一个递归调用,它会在之前失败:
function recursiveMatches(char matrix[][], char needle[], int row, int col)
width, height = dimensions(matrix)
originalRow, originalCol = row, col
/* Check whether we're out of range */
if (width * height < row * width + col + length(needle)) {
return false
}
for (int i = 0 ... len(needle)) {
if (matrix[row][col] != needle[i]) {
/* add one to the position */
originalRow += (originalCol + 1) / width
originalCol = (originalCol + 1) % width
return recursiveMatches(matrix, needle, originalRow, originalCol)
}
/* increment position */
row += (col + 1) / width
col = (col + 1) % width
}
return true
我希望将此转换为正确的java代码不应该太难。