2016-09-09 2 views
-2

나는 무작위 방법으로 문자열 일치 알고리즘을 수행하려고합니다. 하지만 알고리즘이 제대로 작동하지 않습니다, 나는 바운드 인덱스 오류가 나타납니다.문자열 일치 알고리즘을 수정하려고 시도했습니다.

여기

int main() { 

string s = "NOBODY_NOTICED_HIM"; 
string pattern="NOT"; 

int index = 0; 
for (int i = 0; i < s.size();) 
{ 
    for (int j = 0; j < pattern.size();) 
    { 
     if(s[index] == pattern[j]) 
     { 
      j++; 
      i++; 
     } 
     else 
     { 
      index = i; 
        j = 0; 

     } 
    } 
} 
cout<<index<<endl; 
    return 0; 
} 

FIXED VERSION

내가 바운드 예외의 아웃 고정 내 알고리즘이다. 알고리즘이 다른 문자열

j 미만 pattern.size()하지만 당신은 또한 체내 i를 증가하는 동안 루프 조건을 가지고 루프 내부 때문에
int main() { 

string s = "NOBODY_NOTICED_HIM"; 
string pattern="NOT"; 

int index = 0; 
int i = 0; 
while(i < s.size()) 
{ 
    i++; 
    for (int j = 0; j < pattern.size();) 
    { 
     if(s[index] == pattern[j]) 
     { 
      index++; 
      j++; 

      cout<<"i is " <<i << " j is "<<j <<endl; 
     } 
     else 
     { 
      index = i; 

      break; 
     } 
    } 
} 
cout<<i<<endl; 
    return 0; 
} 
+4

올바른 문제 해결 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –

+0

지금 디버거가 없습니다. 나는 이데온을 테스트에 사용하고있다. – Andre

+0

작은 프로그램을 디버깅하는 방법 _ 제안서가 여전히있다. –

답변

1

으로 작동하는지 모르겠어요. is.size() 범위를 벗어나면 index도 범위를 벗어나 OutOfBounds 오류가 발생합니다.

무차별 대항력 방법은 가능한 모든 하위 시퀀스를 사용하여 패턴을 테스트해야합니다. 주요 조건은 길이가 같아야합니다. s의 모든 서브 순서는 다음과 같습니다

[ 'NOB', 'OBO', '이사회', 'ODY', 'DY_', 'Y_N', 'NO', 'NOT', 'OTI' 'TIC', 'ICE', 'CED', 'ED', 'D_H은', '_HI', 'HIM']

그것을 할 수있는 많은 방법이 있습니다

, 당신은에 의해 숯불 할 수 char, 또는 부분 문자열을 취하는 것과 같은 문자열 연산을 사용합니다. 둘 다 학습을위한 훌륭한 교과서입니다.

문자열에서 0부터 시작하여 처음 세 문자를 취하여 패턴과 비교하고 평등하면 답을 제공합니다. 그렇지 않으면 하나부터 시작하는 문자로 넘어갑니다.

+0

알고리즘을 어떻게 수정합니까? 맞습니까? – Andre

+0

여기가 수정이지만 알고리즘이 올바른지 여부는 알 수 없습니다. https://ideone.com/n0F3N3 – Andre

+0

경계를 벗어난 부분을 해결하는 고정 버전을 추가했습니다. 알고리즘이 올바른지 여부는 알 수 없습니다. – Andre

관련 문제