java 28.实现strStr()。java
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 28.实现strStr()。java相关的知识,希望对你有一定的参考价值。
def kmp_matcher(text, pattern):
pi = compute_prefix_function(pattern)
matched = 0
for i, char in enumerate(text):
while matched > 0 and pattern[matched] != text[i]:
matched = pi[matched - 1]
if pattern[matched] == text[i]:
matched += 1
if matched == len(pattern):
return i - len(pattern) + 1
return -1
def compute_prefix_function(pattern):
pi = [0 for i in range(len(pattern))]
matched = 0
for i in range(1, len(pattern)):
while matched > 0 and pattern[i] != pattern[matched]:
matched = pi[matched - 1]
if pattern[i] == pattern[matched]:
matched += 1
pi[i] = matched
return pi
public int strStr(String haystack, String needle) {
for (int i = 0; ; i++) {
for (int j = 0; ; j++) {
if (j == needle.length()) return i;
if (i + j == haystack.length()) return -1;
if (needle.charAt(j) != haystack.charAt(i + j)) break;
}
}
}
/*
Prefix function of Pattern String
"abcdeabeabc"
a b c d e a b e a b c
[0,0,0,0,0,1,2,0,1,2,3]
"AAACAAAA"
A A A C A A A A
[0, 1, 2, 0, 1, 2, 3, 3]
Part1. def get_prefix_function
Part2. def kmp_macher
k = 0
for i in range(len(Text)):
while(k > 0 and Text[i] != Pattern[k]):
k = prefix_funtion[k - 1]]
if Text[i] == Pattern[k]:
k += 1;
if k == len(Pattern)
return i - k + 1;
return -1
*/
public class Solution {
public int[] getPrefixFunction(String pattern){
int[] lps = null;
//// length of the previous longest prefix suffix
if(pattern == null || pattern.length() == 0) return lps;
lps = new int[pattern.length()];
lps[0] = 0;// lps[0] is always 0
int i = 1;
int len = 0;
// the loop calculates lps[i] for i = 1 to M-1
while (i < pattern.length()) {
if (pattern.charAt(i) == pattern.charAt(len)){
len++;
lps[i] = len;
i++;
} else {// (pat[i] != pat[len])
// This is tricky. Consider the example.
// AAACAAAA and i = 7. The idea is similar
// to search step.
if (len != 0){
len = lps[len-1];
// Also, note that we do not increment
// i here
} else { // if (len == 0)
lps[i] = len;
i++;
}
}
}
return lps;
}
public int strStr(String haystack, String needle) {
int lenOfStack = haystack.length();
int lenOfNeedle = needle.length();
if(lenOfNeedle == 0) return 0;
if(lenOfStack < lenOfNeedle) return -1;
int[] lps = getPrefixFunction(needle);
int k = 0;
for (int i = 0; i < lenOfStack; i++){
while(k > 0 && haystack.charAt(i) != needle.charAt(k)){
k = lps[k - 1];
}
if( haystack.charAt(i) == needle.charAt(k)){
k++;
}
if( k == lenOfNeedle){
return i - k + 1;
}
}
return -1;
}
}
class Solution(object):
def strStr(self, haystack, needle):
"""
:type haystack: str
:type needle: str
:rtype: int
"""
h = len(haystack);
n = len(needle);
if n > h :
return -1;
for i in range(h - n + 1):
if haystack[i: i + n] == needle:
return i;
return -1;
class Solution {
/**
* Returns a index to the first occurrence of target in source,
* or -1 if target is not part of source.
* @param source string to be scanned.
* @param target string containing the sequence of characters to match.
*/
public int strStr(String source, String target) {
if (source == null || target == null) {
return -1;
}
for (int i = 0; i < source.length() - target.length() + 1; i++) {
int j = 0;
for (j = 0; j < target.length(); j++) {
if (source.charAt(i + j) != target.charAt(j)) {
break;
}
}
// finished loop, target found
if (j == target.length()) {
return i;
}
}
return -1;
}
}
以上是关于java 28.实现strStr()。java的主要内容,如果未能解决你的问题,请参考以下文章