28. 找出字符串中第一个匹配项的下标
题目:
思路:
【1】暴力破解
【2】动态规划
【3】KMP算法(待写)
代码展示:
//时间4 ms 击败 2.42% //内存40 MB 击败 5.5% class Solution { public int strStr(String haystack, String needle) { int col = haystack.length(); int row = needle.length(); // 编辑动态规划的结果 int[][] result = new int[row][col]; // 初始化数据 for (int[] res : result){ Arrays.fill(res,0); } // 利用动态规划的方式 for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ if (needle.charAt(i) == haystack.charAt(j)){ // 特殊情况下,不存在数组越界,如果匹配,只能说匹配到了一个 if (i == 0 || j == 0){ result[i][j] = 1; }else { // 而非特殊情况下,需要查阅上个字符匹配到了哪个位置且+1 result[i][j] = result[i-1][j-1] + 1; } //如果已经匹配完了目标字符串,就应该直接结束返回最先的下标 if (result[i][j] == row) return j - row + 1; } } } return -1; } } //时间0 ms击败 100% //内存39.3 MB 击败 86.36% class Solution { public int strStr(String haystack, String needle) { int n = haystack.length(), m = needle.length(); for (int i = 0; i + m <= n; i++) { boolean flag = true; for (int j = 0; j < m; j++) { if (haystack.charAt(i + j) != needle.charAt(j)) { flag = false; break; } } if (flag) { return i; } } return -1; } }