saberhark   3년 전

kmp 에서 pi[] 구하는 방법에 착안해서

abcdabcaabb

맨 시작점은 i로 잡고 j를 증가하면서 charAt(i)와 charAt(j)를 비교합니다. 일치하면 cnt와 j를 1씩 증가 시켜주고 charAt(i+cnt)와 charAt(j)를 비교합니다

코드에서는 위의 밑줄친 부분이 charAt(i+cnt) == charAt(j)로 돼있습니다. 매번 cnt를 0으로 초기화해주기 때문에 동일합니다.

그리고 j가 문자열의 끝에 도달하면 정지=>> if(j >=len) break;

charAt(i+cnt)와 chartAt(j)이 일치 하지 않으면 0으로 처리가 되는데 간혹 0부터 시작이 아니라 1부터 시작해야 되는 경우가 있습니다. pi가 000123001234 이런 식이 아니라 0001231234512이런 경우처럼

즉 charAt(i+cnt)와 chartAt(j) 일치하지 않지만 charAt(i) / 맨 앞 문자 와 charAt(j)/ 다음 문자 가 일치 하는 경우는 0이 아니라 1입니다. 따라서 이 경우는 cnt를 0으로 처리해주어서 while을 탈출 하지 않고 다시 돌게 해줍니다. =>> cnt가 0 이면 while(input.charAt(i+cnt) == input.charAt(j)) 이 true이기 때문이죠(j는 그대롭니다.)

pi[]배열을 만들지 않고 단순 카운트만해도 충분할 거 같아서 이렇게 만들었는데 문제가 없어 보이는데 자꾸 틀렸다고 나오네요...

질문 게시판에서 찾은 반례들은 다해봤고 통과했습니다.

seurametum   2년 전

시간이 많이 지났지만,,

ababcdabababcd

로 해보시겠어요?

ababcd 6이 나와야합니다.

댓글을 작성하려면 로그인해야 합니다.