RK算法全程Rabin-Karp,该算法的2位发明者Rabin和Karp的名字组合而成。该算法的核心思想就是通过比较2个字符串的hashcode来判断是否包含对方。
但是要注意发生hash冲突
public class Test {
public static void main(String[] args) {
String source = "abcdefghijklmn";
String target = "efg";
System.out.println(compireStr1(source, target));
}
/** 字符串的RK算法,求字串第一次出现的位置
* @param source
* @param target
* @return
*/
private static int compireStr1(String source, String target){
//临界值
if (StringUtils.isEmpty(source) || source.length() < target.length() || StringUtils.isEmpty(target)){
return -1;
}
//1、获取target的长度和hash值
int hash = computeStrToHash(target);
int len = target.length();
//2、截取source等长的字符串
StringBuilder str = new StringBuilder(source.substring(0, len));
for (int i = len; i <= source.length(); i++) {
String s = str.toString();
//hash相等并且字符串也相等
if (compireHashValue(hash,s) && s.equals(target)){
return i-len;
}
//字符串删除第一位,往后移动一位,
str = str.deleteCharAt(0).append(source.charAt(i));
}
return -1;
}
/**
* 计算hash值
* @param source
* @return
*/
private static int computeStrToHash(String source){
int hash = 0;
for (int i = 0; i < source.length(); i++) {
hash += String.valueOf(source.charAt(i)).hashCode();
}
return hash;
}
/**
* 判断字符串的hash值是否等于指定值
* @param hashTotal
* @param str
* @return
*/
private static boolean compireHashValue(int hashTotal, String str){
return computeStrToHash(str) == hashTotal;
}
}
时间复杂度O(n)
还有优化的地方,重复计算