import java.util.ArrayList;
import java.util.List;
/*
Word search
*/
public class Solution {
public static void main(String[] args) {
// int[][] wordSearch = new int[][]{
// {'f', 'd', 'e', 'r', 'l', 'k'},
// {'u', 's', 'a', 'm', 'e', 'o'},
// {'l', 'n', 'g', 'r', 'o', 'v'},
// {'m', 'l', 'p', 'r', 'r', 'h'},
// {'p', 'o', 'e', 'e', 'j', 'j'}
// };
int[][] wordSearch = new int[][]{
//0 1 2 3 4 5 6
{'f', 'd', 'e', 'r', 'l', 'k', 'x'},// 0
{'u', 's', 'a', 'm', 'e', 'o', 'd'},// 1
{'l', 'n', 'g', 'r', 'o', 'v', 'z'},// 2
{'m', 'l', 'p', 'r', 'r', 'h', 'w'},// 3
{'p', 'o', 'e', 'e', 'a', 'a', 'c'},// 4
{'u', 's', 'a', 'm', 'a', 'a', 'd'},// 5
{'l', 'n', 'g', 'r', 'a', 'a', 'z'},// 6
{'m', 'l', 'p', 'r', 'a', 'a', 'w'},// 7
{'p', 'o', 'e', 'q', 's', 'a', 'c'},// 8
{'f', 'd', 'e', 'r', 'a', 'a', 'x'},// 9
};
List<Word> list2 = detectAllWords(wordSearch, "qsa","aaaa");
for(Word word: list2){
System.out.println(word);
}
/*
Expected result
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] wordSearch, String... words) {
List<Word> list = new ArrayList<>();
for(String word: words){
list.add(new Word(word));
}
int MIN_X = 0;
int MAX_X = wordSearch.length-1;
int MIN_Y = 0;
int MAX_Y = wordSearch[0].length-1;
for(Word word: list) {
int substring = 0;
outer:
for (int i = 0; i < wordSearch.length; i++) {
for (int j = 0; j < wordSearch[i].length; j++) {
if (String.valueOf((char)wordSearch[i][j]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char)wordSearch[i][j])+ " layer 1 " + i + " - " + j + " - " + substring);
substring++;
word.startX = j;
word.startY = i;
if (substring == word.text.length()) {
word.endX = j;
word.endY = i;
// System.out.println("done");
break outer;
}
int startPosX = (i - 1 < MIN_X) ? i : i - 1;
int startPosY = (j - 1 < MIN_Y) ? j : j - 1;
int endPosX = (i + 1 > MAX_X) ? i : i + 1;
int endPosY = (j + 1 > MAX_Y) ? j : j + 1;
int rowNum = startPosX;
int colNum = startPosY;
boolean s = true;
while (rowNum <= endPosX) {
while (colNum <= endPosY) {
if(rowNum != i || colNum != j) {
if (String.valueOf((char) wordSearch[rowNum][colNum]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[rowNum][colNum]) + " layer 2 " + rowNum + " - " + colNum+ " - " + substring);
substring++;
s = true;
if (substring == word.text.length()) {
word.endX = colNum;
word.endY = rowNum;
// System.out.println("done");
break outer;
}
while (s == true) {
if (rowNum > i && colNum == j) {
for (int k = rowNum + 1; k <= wordSearch.length; k++) {
if (String.valueOf((char) wordSearch[k][j]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[k][j]) + " layer 3 vertical down");
if (substring == word.text.length() - 1) {
word.endX = j;
word.endY = k;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
}
}
if (rowNum < i && colNum == j) {
for (int k = rowNum - 1; k >= 0; k--) {
if (String.valueOf((char) wordSearch[k][j]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[k][j]) + " layer 3 vertical up ");
if (substring == word.text.length() - 1) {
word.endX = j;
word.endY = k;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
}
}
if (rowNum == i && colNum > j) {
for (int k = colNum + 1; k < wordSearch[i].length; k++) {
if (String.valueOf((char) wordSearch[i][k]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[i][k]) + " layer 3 horizontal right ");
if (substring == word.text.length() - 1) {
word.endX = k;
word.endY = i;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
}
}
if (rowNum == i && colNum < j) {
for (int k = colNum - 1; k >= 0; k--) {
if (String.valueOf((char) wordSearch[i][k]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[i][k]) + " layer 3 horizontal left ");
if (substring == word.text.length() - 1) {
word.endX = k;
word.endY = i;
// System.out.println("done");
System.out.println(word.endX + " " + word.endY);
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
}
}
if (rowNum > i && colNum > j) {
int l = rowNum + 1;
for (int k = colNum + 1; k <= wordSearch.length; k++) {
if ((substring <= word.text.length()) && String.valueOf((char) wordSearch[l][k]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[l][k]) + " layer 3 diagonal down ");
if (substring == word.text.length() - 1) {
word.endX = k;
word.endY = l;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
l++;
}
}
if (rowNum < i && colNum < j) {
int l = rowNum - 1;
for (int k = colNum - 1; k >= 0; k--) {
if ((l >= 0 && k >= 0) && String.valueOf((char) wordSearch[l][k]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[l][k]) + " layer 3 diagonal up");
if (substring == word.text.length() - 1) {
word.endX = k;
word.endY = l;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
l--;
}
}
s = false;
}
}
}
substring = 1;
colNum++;
}
rowNum++;
colNum = startPosY;
}
}
substring = 0;
}
}
}
return list;
}
public static class Word {
private String text;
private int startX;
private int startY;
private int endX;
private int endY;
public Word(String text) {
this.text = text;
}
public void setStartPoint(int i, int j) {
startX = i;
startY = j;
}
public void setEndPoint(int i, int j) {
endX = i;
endY = j;
}
@Override
public String toString() {
return String.format("%s - (%d, %d) - (%d, %d)", text, startX, startY, endX, endY);
}
}
}
I tried a lot of cases and in every case it shows the right answer. Am I missing something? Like maybe that words can occur multiple times in the array should I create 2 words objects for that case and print both words coordinates?package com.codegym.task.task20.task2027;
import java.util.ArrayList;
import java.util.List;
/*
Word search
*/
public class Solution {
public static void main(String[] args) {
int[][] wordSearch = new int[][]{
{'f', 'd', 'e', 'r', 'l', 'k'},
{'u', 's', 'a', 'm', 'e', 'o'},
{'l', 'n', 'g', 'r', 'o', 'v'},
{'m', 'l', 'p', 'r', 'r', 'h'},
{'p', 'o', 'e', 'e', 'j', 'j'}
};
List<Word> list2 = detectAllWords(wordSearch, "home","same");
for(Word word: list2){
System.out.println(word);
}
/*
Expected result
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] wordSearch, String... words) {
List<Word> list = new ArrayList<>();
for(String word: words){
list.add(new Word(word));
}
int MIN_X = 0;
int MAX_X = wordSearch.length-1;
int MIN_Y = 0;
int MAX_Y = wordSearch[0].length-1;
for(Word word: list) {
int substring = 0;
outer:
for (int i = 0; i < wordSearch.length; i++) {
for (int j = 0; j < wordSearch[i].length; j++) {
if (String.valueOf((char)wordSearch[i][j]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char)wordSearch[i][j])+ " layer 1 " + i + " - " + j + " - " + substring);
substring++;
word.startX = j;
word.startY = i;
if (substring == word.text.length()) {
word.endX = j;
word.endY = i;
// System.out.println("done");
break outer;
}
int startPosX = (i - 1 < MIN_X) ? i : i - 1;
int startPosY = (j - 1 < MIN_Y) ? j : j - 1;
int endPosX = (i + 1 > MAX_X) ? i : i + 1;
int endPosY = (j + 1 > MAX_Y) ? j : j + 1;
int rowNum = startPosX;
int colNum = startPosY;
boolean s = true;
while (rowNum <= endPosX) {
while (colNum <= endPosY) {
if(rowNum != i || colNum != j) {
if (String.valueOf((char) wordSearch[rowNum][colNum]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[rowNum][colNum]) + " layer 2 " + rowNum + " - " + colNum+ " - " + substring);
substring++;
s = true;
if (substring == word.text.length()) {
word.endX = colNum;
word.endY = rowNum;
// System.out.println("done");
break outer;
}
while (s == true) {
if (rowNum > i && colNum == j) {
for (int k = rowNum + 1; k <= wordSearch.length; k++) {
if (String.valueOf((char) wordSearch[k][j]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[k][j]) + " layer 3 vertical down");
if (substring == word.text.length() - 1) {
word.endX = j;
word.endY = k;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
}
}
if (rowNum < i && colNum == j) {
for (int k = rowNum - 1; k >= 0; k--) {
if (String.valueOf((char) wordSearch[k][j]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[k][j]) + " layer 3 vertical up ");
if (substring == word.text.length() - 1) {
word.endX = j;
word.endY = k;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
}
}
if (rowNum == i && colNum > j) {
for (int k = colNum + 1; k < wordSearch[i].length; k++) {
if (String.valueOf((char) wordSearch[i][k]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[i][k]) + " layer 3 horizontal right ");
if (substring == word.text.length() - 1) {
word.endX = k;
word.endY = i;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
}
}
if (rowNum == i && colNum < j) {
for (int k = colNum - 1; k >= 0; k--) {
if (String.valueOf((char) wordSearch[i][k]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[i][k]) + " layer 3 horizontal left ");
if (substring == word.text.length() - 1) {
word.endX = k;
word.endY = i;
// System.out.println("done");
System.out.println(word.endX + " " + word.endY);
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
}
}
if (rowNum > i && colNum > j) {
int l = rowNum + 1;
for (int k = colNum + 1; k <= wordSearch.length; k++) {
if ((substring <= word.text.length()) && String.valueOf((char) wordSearch[l][k]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[l][k]) + " layer 3 diagonal down ");
if (substring == word.text.length() - 1) {
word.endX = k;
word.endY = l;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
l++;
}
}
if (rowNum < i && colNum < j) {
int l = rowNum - 1;
for (int k = colNum - 1; k >= 0; k--) {
if ((l >= 0 && k >= 0) && String.valueOf((char) wordSearch[l][k]).equals(word.text.substring(substring, substring + 1))) {
// System.out.println(String.valueOf((char) wordSearch[l][k]) + " layer 3 diagonal up");
if (substring == word.text.length() - 1) {
word.endX = k;
word.endY = l;
// System.out.println("done");
s = false;
break outer;
}
substring++;
} else {
substring = 1;
s = false;
break;
}
l--;
}
}
s = false;
}
}
}
substring = 1;
colNum++;
}
rowNum++;
colNum = startPosY;
}
}
substring = 0;
}
}
}
return list;
}
public static class Word {
private String text;
private int startX;
private int startY;
private int endX;
private int endY;
public Word(String text) {
this.text = text;
}
public void setStartPoint(int i, int j) {
startX = i;
startY = j;
}
public void setEndPoint(int i, int j) {
endX = i;
endY = j;
}
@Override
public String toString() {
return String.format("%s - (%d, %d) - (%d, %d)", text, startX, startY, endX, endY);
}
}
}