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?