2012-02-21 2 views
5

Che cos'è un comando di shell per trovare la sottostringa comune più lunga di due stringhe in unix? come: foo 'abcdefghi' 'abjklmdefnop' stampe: defChe cos'è un comando shell per trovare la sottostringa comune più lunga di due stringhe in unix?

+0

Questo bisogno di essere POSIX? Mirato a qualsiasi specifica distribuzione? – Daenyth

+0

è meglio farlo funzionare sulla maggior parte degli linux – user1081596

+0

@ user1081596: Quindi consiglio di implementarlo in perl, perché verrà installato su ogni linux a meno che l'utente non lo abbia rimosso. – Daenyth

risposta

2

Questo è noto come la massima sottosequenza comune e ci sono alcuni grandi algoritmi per esso. Dai un'occhiata alla soluzione di programmazione dinamica (se cerchi su google, troverai un sacco di implementazioni). Se davvero si vuole capire questo a un livello algoritmico, controlla questa conferenza MIT,

http://videolectures.net/mit6046jf05_leiserson_lec15/

+1

Grazie per questo link. Ma per ora temo di avere solo bisogno di una soluzione standard a linea di comando rapida e non mi dispiacerebbe se fosse implementato con la complessità di O (n^5). – user1081596

+0

@ user1081596: Che dimensioni saranno i tuoi input? – Daenyth

3

io non sono sicuro se c'è un unico comando che fa il lavoro per voi, ma il seguente script bash dovrebbe fare esso.

#!/bin/bash 

word1="$1" 
word2="$2" 
if [ ${#word1} -lt ${#word2} ] 
then 
     word1="$2" 
     word2="$1" 
fi 
for ((i=${#word2}; i>0; i--)); do 
     for ((j=0; j<=${#word2}-i; j++)); do 
       if [[ $word1 =~ ${word2:j:i} ]] 
       then 
         echo ${word2:j:i} 
         exit 
       fi 
     done 
done 

Salva quanto sopra come un file substr.sh fare chmod + x substr.sh

pranithk @ ~ 
09:24:32 :) $ ./substr.sh 'abcdefghi' 'abcdeghi' 
abcde 

pranithk @ ~ 
09:24:33 :) $ ./substr.sh 'abcdefghi' 'abjklmdefnop' 
def