How can I determine all possible ways a subsequence can be removed from a sequence?

前端 未结 6 2076
执念已碎
执念已碎 2021-01-31 08:29

Given two sequences, A and B, how can I generate a list of all the possible ways that B can be removed from A?

For example, In JavaSc

6条回答
  •  猫巷女王i
    2021-01-31 08:56

    My aim was to create and call functions as little as possible. This seems to work. Could definitely be cleaned up. Something to play around with...

    function removeSubSeq( seq, sub ) {
    
        var arr,
            sub_v,
            sub_i = 0,
            seq_i,
            sub_len = sub.length,
            sub_lenm1 = sub_len - 1,
            seq_len = seq.length,
            pos = {},
            pos_len = [],
            c_pos,
            map_i = [],
            len,
            r_pos,
            sols = [],
            sol;
    
        do {
    
            map_i[ sub_i ] = 0;
            sub_v = sub[ sub_i ];
    
            if( pos[ sub_v ] ) {
    
                pos_len[ sub_i ] = pos_len[ sub_i - 1 ];
                continue;
            
            }
    
            arr = pos[ sub_v ] = [];
    
            c_pos = 0;
    
            seq_i = seq_len;
    
            while( seq_i-- ) {
    
                if( seq[ seq_i ] === sub_v ) {
                    
                    arr[ c_pos++ ] = seq_i;
    
                }
    
            }
    
            pos_len[ sub_i ] = arr.length;
    
        } while( ++sub_i < sub_len );
    
        len = pos[ sub[ 0 ] ].length;
    
        while( map_i[ 0 ] < len ) {
    
            sub_i = 0;
            arr = [];
    
            do {
    
                r_pos = pos[ sub[ sub_i ] ][ map_i[ sub_i ] ];
                
                if( sub_i && r_pos <= arr[ sub_i - 1] ) break;
                
                arr.push( r_pos );
            
            } while( ++sub_i < sub_len );
    
            if( sub_i === sub_len ) {
                
                sol = seq.slice( 0 );
    
                while( sub_i-- ) sol.splice( arr[ sub_i ], 1 );
    
                sols.push( sol );
            
            }
    
            sub_i = sub_lenm1;
    
            while( ++map_i[ sub_i ] === pos_len[ sub_i ] ) {
                if( sub_i === 0 ) break;
                map_i[ sub_i-- ] = 0;
            }
    
        } while( map_i[ 0 ] < len );
    
        return sols;
    
    }
    
    console.log(JSON.stringify(removeSubSeq([1,2,1,3,1,4,4], [1,4,4])));
    console.log(JSON.stringify(removeSubSeq([8,6,4,4], [6,4,8])));
    console.log(JSON.stringify(removeSubSeq([1,1,2], [1])));
    console.log(JSON.stringify(removeSubSeq(['a','g','b','a','b','c','c'], ['a','b','c'])));

提交回复
热议问题