js 이상 한 면접 문제 가 나 왔 습 니 다.

22116 단어 알고리즘전단
제목.
A, B, C 는 3 개의 문자열 이다.A 에 포 함 된 모든 B 를 C 로 교체 하고 교체 후에 B 가 있 으 면 A 가 B 를 포함 하지 않 을 때 까지 계속 교체 합 니 다

  • 4. 567917. 프로그램 을 작성 하여 상기 기능 을 실현 하 십시오.시스템 에서 제공 하 는 문자열 비교, 찾기, 교체 함 수 를 사용 할 수 없습니다


  • 4. 567917. 이상 프로그램 은 항상 결 과 를 정상적으로 출력 할 수 있 습 니까?만약 그렇지 않다 면, 어떤 상황 에서 정상적으로 출력 할 수 없 는 결 과 를 열거 하고, 가능 한 한 상세 하고 전면적으로..


  • 전혀 이런 문 제 는 아니 지만 알고리즘 문제 임 을 알 수 있 고 문자열 을 찾 지 못 하 는 것 은 어 려 운 부분 입 니 다.
    솔 루 션 문자열 을 바 꾸 려 면 KMP 나 BF 알고리즘 js 를 사용 해 야 합 니 다.
    
    // KPM  
    //         
    function initTable( str ){
        let arr = str.split('');//     
        let table = [];
    
        //        
    
        //                
        function _getFitValue( partString ){
            let partFitValue = 0;
            let prefixArr = []; //     
            let suffixArr = []; //     
    
            //               
            function _getSameLength( arr1, arr2 ){
                for(let i of arr1){
                    for(let j of arr2){
                        if(i==j){
                            console.log('    ', i)
                            return i.length;
                        }
                    }
                }
                return 0;
            }
            //       
            if( partString.length > 2 ) {
                for ( let i = 1; i < partString.length ; i++ ) {
                    let j = partString.length - i;
                    prefixArr.push( partString.substr( 0, i ) );
                    suffixArr.push( partString.substr( i, j ) );
                }
                console.log('prefixArr',prefixArr);
                console.log('suffixArr',suffixArr);
                partFitValue = _getSameLength( prefixArr, suffixArr );
                return partFitValue;
    
            } else {
                return partFitValue;
            }
        }
        for( let i = 0; i < arr.length; i++ ) {
            let testStr = str.substr(0,i+1);
            console.log('testStr', testStr)
            table[i] = _getFitValue( testStr );
        }
        return table;
    };
    let table = initTable('ABCDABD');
    console.log('table', table);
    // KMP         a         b       b     a            -1
    
    function KMP(sourceStr, searchStr) {
        //     
        let part = initTable(searchStr);
        let sourceLength = sourceStr.length;
        let searchLength = searchStr.length;
        let result;
        let i = 0;
        let j = 0;
    
       for (; i < sourceStr.length; i++) { //     ,  
    
            //   
            for (j = 0; j < searchLength; j++) {
                //       
                if (searchStr.charAt(j) === sourceStr.charAt(i)) {
                    //       
                    if (j == searchLength - 1) {
                      result = i - j;
                      break;
                    } else {
                      //      ,     ,i++           
                      i++;
                    }
                } else {
                  //       i     
                  if (j > 1 && part[j - 1] > 0) {
                    i += (i - j - part[j - 1]);
                  } else {
                    //    
                    i = (i - j)
                  }
                  break;
                }
            }
            if (result || result === 0) {
              break;
            }
        }
    
    
        if (result || result == 0) {
          return result
        } else {
          return -1;
        }
    }
    
    
    let index = KMP('BBC ABCDAB ABCDABCDABDE','ABCDABD');
    
    function replaceString( a, b, c ){
        while(true){
            let num = KMP( a, b );//       indexOf()                    
            if( num !== -1 ){
                let a_chars = a.split('');
                a = "";
                let count = 0;
                for ( let i = 0; i < a_chars.length; i++ ) {
                    if( i >= num && (i < num + b.length)){
                        if( count === 0 ) {
                            a = a + c;
                        }
                        count++;
                    } else {
                        a = a + a_chars[i];
                    }
                }
            } else {
                return a;
            }
        }
    }
    
    //        :          c   b               
    replaceString('cccccc','c','bc');
    

    인용 하 다.

    좋은 웹페이지 즐겨찾기