leetcode5207 [Day30 화이트 빗자루 TITLE]. 가능한 한 따라서 문자열이 동일한 (leetcode 156초 표제 게임 주 주 등)임을

  • 저우 경주 요약
  1. 나쁜 나쁜 재단, 주로 C ++ 템플릿 프로그래밍, C, 같은 언어의 기본 구문, 그래서 아무 문제가, STL 템플릿의 사용을 포함, 바이 쓰는 동안, 망치를 할 수있는, 눈을 멀게 봐! ! ! !
  • 벡터 템플릿 : 벡터 <INT> nums (10, 0)의 벡터 템플릿 선언 정수의 1 차원 배열을 이용하여 초기화
      • 벡터 <벡터 <INT >> DP (100 <벡터 <INT >> (2, 0))는 2 차원 배열은 벡터, 2 * 100 사이즈를 0으로 초기화된다 정의한

    이 2 차원 배열의 경우 적어도 20 분 낭비! ! !

  • 하위 문자열 및 서브는 순수 문자열 연속 순서가 연속적이지입니다, 말씀, 당신이 명심해야 할 중요한 것은, 나는 세 번하지 않습니다.

    서브 타이틀 시퀀스는 적어도 20 분 낭비, 문자열을 할 수 있습니다.

  • unordered_map도, 나는 적어도 5 분 동안 검색, 사전에이 볼 수있는 키를 몰라! ! !
    사용자 정의 템플릿 반복자 : unordered_map도 <INT, INT> :: IT를 반복자;
     map.find () 함수가 있는지 열쇠 : IF ( map1.find (ARR [I]) == map1.end () )
    그것은 볼 수 있습니다 : 리턴 키를 반복자는 map.end를 반환하는 키가 아닌 경우 ()
 
     지도 탐색 : 그것은 액세스 키를 반복자, 값 :
           IT-> 제 IT-> 제
  • 윈도우 방법을 슬라이딩 , 아직 능숙하지 않다 강화 운동이 필요합니다! ! !
 
 
처음 내지 : 2 차원 배열이 수행 DP
클래스 해결 {
 공개 :
     INT의 equalSubstring ( 문자열 S, 문자열 T, int로 maxCost)을 {
         INT MAX_LEN = 0 ; 
        벡터 < INT >를 nums (t.size (), 0 );   // 1 차원 배열 
        벡터 <벡터 < INT >> DP는 (t.size (), 벡터 < INT > ( 2 , 0 ));    // 2 차원 어레이 및 초기화 벡터 
        
        에 대한이 ( int로 난 = 0 ; I는 s.size () "; ++ I) { 
            nums을 [I ]ABS는 = (S는 [나는] - T는 [내가]);             
        } 
        
        // DP DP 초기화 배열 초기화는 신중 매우 중요합니다! ! ! 
        IF 합니다 (nums가 [ 0 ] <= maxCost)는 { 
            DP가 [ 0 ] [ 0 ]을 nums가 = [ 0 ] 
            DP [ 0 ] . 1 ] = 1이다. ] 
            MAX_LEN =를 . 1 ; 
        } 
        
         ( INT I = 1. , I는 S를 <. 크기 (); ++ I) {
             IF (DP [I- . 1 ] [ 0 ] +를 nums [I] <= 0 maxCost) {
                DP가 [I]를 [ ;= DP [Ⅰ- 1 ] [ 0 ] + nums [I]; 
                DP가 [I] [ 1 ]을 DP = [I- 1 ] [ 1 ] + 1 ; 
            } 
            다른 {
                 INT TMP = DP [Ⅰ- 1 ] [ 0 ], J;
                에 대한 (j = 1-DP [Ⅰ- 1 ] [ 1 ] J <= 1; ++ j)는 { 
                    TMP - = nums [J]
                    경우 (TMP + nums [I] <= maxCost)
                         체류 
                } 
                DP [I]0 ]의 tmp = +의 nums [I]을; 
                DP [I] [ 1 ] = 1 - J;                
            } 
            MAX_LEN = 최대 (MAX_LEN, DP [I] [ 1 ]);            
        } 
        
        반환 MAX_LEN; 
    } 
};

문자열이 연속이기 때문에 할 슬라이딩 윈도우 방법을 사용하여 생각하기 쉽고, 요소> = 0, 슬라이딩 윈도우의 반환하지 않습니다! ! !

클래스 해결 {
 공개 :
     INT의 equalSubstring ( 스트링 들, 스트링 t, int로 maxCost)을 {
         INT MAX_LEN = 0 ; 
        벡터 < INT > nums (s.size (), 0 ); 
        
        위한 ( int로 난 = 0 ; i가 s.size ()을 <; ++ I) 
            nums [I] = ABS (S [I] - t [I]); 
        
        INT 시작 = 0 , 최종 = 0 , sum_tmp = 0 ;
         (말단 <s.size (); ++ 단부) {
            sum_tmp + = nums [END];
            경우 (sum_tmp <= maxCost)
                 계속 ;
            { 
                MAX_LEN = 최대 (MAX_LEN, 최종 개시);
                반면 (sum_tmp> maxCost) { 
                    sum_tmp = 된 - ; nums는 [시작]
                    ++ 시작; 
                } 
            }             
        } 

        반환 최대 (MAX_LEN, 최종 시작) 
    } 
};

분명히 더 나은 슬라이딩 윈도우 방법입니다 사용,

명확하고 간결한 코드, 시간과 공간의 복잡성이 크게 완벽 해 감소! ! ! .

추천

출처www.cnblogs.com/ACStrive/p/11610537.html