算法的精妙不在于代码,而在于思想
暴力求解法
从字符串 str1中匹配,子字符串 str2
- 如果当前字符匹配成功, 即 str1[i]==str2[j], 则 i++; j++; 继续匹配下一个字符
- 如果当前字符匹配失败, 则 i=i-(j-1); j=0; 也就是每次匹配失败时, i回溯, j被置为0
图解:
- 1、我们比较i指针指向的字符和j指针指向的字符是否一致。如果一致就都向后移动,如果不一致,如下图:
*2、 A和E不相等,那就把i指针移回第1位(假设下标从0开始),j移动到模式串的第0位,然后又重新开始这个步骤:
代码:
/**
* 暴力破解法
* @param ts 主串
* @param ps 模式串
* @return 如果找到,返回在主串中第一个字符出现的下标,否则为-1
*/
public static int bf(String ts, String ps) {
char[] t = ts.toCharArray();
char[] p = ps.toCharArray();
int i = 0; // 主串的位置
int j = 0; // 模式串的位置
while (i < t.length && j < p.length) {
if (t[i] == p[j]) {
// 当两个字符相同,就比较下一个
i++;
j++;
} else {
i = i