9.11 ~ 9.16 훈련 집 --- 비교적 중요, kmp 편

2286 단어 훈련 집
kmp, 다른 문자열 과 같은 부분의 알고리즘 을 빠르게 구 합 니 다. 이번 주 에 조금 배 웠 습 니 다. 먼저 붙 이 고 다음 주 에 더 깊이 배 워 야 합 니 다. 대체적인 사고: 예비 처리 모드 접두사 접두사, 모든 접두사 가 최대 접두사 와 일치 합 니 다. (알 기 어렵 습 니 다. 기본적으로 폭력 이 일치 할 때 특정한 문자 가 다 를 때 이동 해 야 할 최대 거리 입 니 다)일치 하 는 패턴 문자열 에서 가장 긴 접두사 와 접 두 사 를 찾 아 이동 하여 겹 치 게 합 니 다.핵심 코드 (기본적으로 오 선생님 의 코드 를 강제로 외 우 는 것...) 1. 예비 처리 코드, 각 위치 문 자 를 일치 시 키 는 데 실 패 했 습 니 다. 오른쪽으로 이동 해 야 할 최대 거 리 는 p [] 배열 이 존재 합 니 다.
void getp(int n)
{int i,j;
 p[0]=-1;
 j=-1;//     ,                   
 for(i=1;i<=n;i++)
  {while(j>=0&&s1[j+1]!=s1[i])
   {j=p[j];//   ,   ,      ,         ,       
   }
   j++;//         ++
   p[i]=j;//  
  }
  for(i=1;i<=n;i++)
  //cout<

; }


2. 코드 를 일치 시 키 고 처 리 된 패턴 문자열 을 대기 문자열 과 일치 시 키 는 것 은 기본적으로 예비 처리 코드 의 사고 와 일치 하 며 디 테 일 은 약간 차이 가 있 습 니 다.
int kmp(int n,int m)
{int i,j,ret=0;
for(i=1,j=0;i<=m;i++)//  j 0   ,                  ,       
 {while(j>=0&&s1[j+1]!=s2[i])//     ,     
   {j=p[j];
    }
  j++;//      ++
  if(j==n)//    ,    ,j      
  {ret++;
   j=p[j];
  }
 }
 return ret;
}

좋은 웹페이지 즐겨찾기