Periksa apakah suatu string merupakan pengocokan dari dua string lain yang diberikan

Ini adalah pertanyaan dari Manual Perancangan Algoritma:

Misalkan Anda diberikan tiga rangkaian karakter: X, Y, dan Z, di mana |X| = n, |Y| = m, dan |Z| = n+m. Z dikatakan sebagai pengocokan X dan Y jika dan hanya jika Z dapat dibentuk dengan menyisipkan karakter dari X dan Y dengan cara yang mempertahankan urutan karakter dari kiri ke kanan dari setiap string.

Berikan algoritma pemrograman dinamis yang efisien yang menentukan apakah Z merupakan pengocokan dari X dan Y.

Petunjuk: nilai matriks pemrograman dinamis yang Anda buat harus berupa Boolean, bukan numerik

Inilah yang saya coba:

Awalnya, saya membuat array karakter 1-D dan pointer ke karakter awal X,Y,Z masing-masing. Jika Z-pointer cocok dengan X-pointer, simpan X di array char, jika tidak, periksa hal yang sama dengan Y-pointer. Jika setiap entri dalam array char tidak berbeda dengan entri terakhirnya, Z tidak disisipkan.

Bisakah seseorang membantu saya mengatasi masalah ini?


person piyukr    schedule 24.11.2013    source sumber
comment
Tolong tunjukkan apa yang telah Anda coba.   -  person Abhishek Bansal    schedule 24.11.2013
comment
@Mörre Tidak, ini bukan pekerjaan rumah saya. Saya hanya mengutip Manual Perancangan Algoritma   -  person piyukr    schedule 24.11.2013
comment
Anda harus menunjukkan usaha sendiri jika ingin respon yang baik dari SO.   -  person Abhishek Bansal    schedule 24.11.2013
comment
@AbhishekBansal.Inilah yang saya coba: Awalnya, saya membuat array karakter 1-D dan menunjuk ke karakter awal X,Y,Z masing-masing. Jika Z-pointer cocok dengan X-pointer, simpan X di array char, jika tidak, periksa hal yang sama dengan Y-pointer. Jika setiap entri dalam array char tidak berbeda dengan entri terakhirnya, Z tidak disisipkan.   -  person piyukr    schedule 24.11.2013


Jawaban (5)


Pendekatan berikut akan memberi Anda gambaran.

Tentukan kondisi d(s1,s2,s3) = (s1 + s2 == s3) { s3 is a shuffle of s1 and s2 }

Kita harus menemukan d( X, Y, Z ).

jika panjang s1 dan s2 masing-masing 1 dan panjang s3 = 2,

d( s1,s2,s3 ) = { (s1[0] == s3[0] && s2[0] == s3[1]) || (s1[0] == s3[1] && s2[0] == s3[0])

Demikian pula d dapat diperoleh untuk string kosong.

Untuk string dengan panjang sembarang, relasi berikut berlaku.

d( s1,s2,s3 ) = { ( d( s1-s1[last],s2,s3 - s3[last]) && s1[last] == s3[last] )
                  || ( d( s1,s2 - s2[last],s3 - s3[last]) && s2[last] == s3[last] )
                }

Anda dapat menghitung d() entri mulai dari string dengan panjang nol dan terus memeriksa.

person Abhishek Bansal    schedule 24.11.2013
comment
bukankah interleaving menyiratkan bahwa karakter yang berurutan di Z harus dari X dan Y sebagai alternatif? - person piyukr; 24.11.2013
comment
Tidak. Interleaving hanya menyiratkan bahwa Z harus berisi semua karakter di X dan Y dan dalam urutan yang sama seperti di string masing-masing. Misalnya, abc dan def dan disisipkan menjadi abcdef. - person Abhishek Bansal; 24.11.2013

Pertama, mari kita mulai dengan beberapa definisi. Saya menulis X[i] untuk elemen ke i dari X dan X[i) untuk substring X dimulai dari indeks i.

Misalnya jika X = abcde, maka X[2] = c dan X[2) = cde.

Definisi serupa berlaku untuk Y dan Z.


Untuk mengatasi masalah dengan pemrograman dinamis, Anda harus menyimpan array boolean 2D A dengan ukuran (n+1) x (m+1). Dalam larik ini, A[i, j] = true jika dan hanya jika X[i) dan Y[j) dapat disisipkan ke bentuk Z[i+j).

Untuk (i, j) arbitrer, di suatu tempat di tengah array 2D, relasi perulangannya sangat sederhana:

A[i, j] := X[i] = Z[i+j] and A[i+1, j]
        or Y[j] = Z[i+j] and A[i, j+1]

Di tepi array 2D Anda mempunyai kasus bahwa X atau Y sudah berada di akhir, yang berarti akhiran yang lain harus sama dengan akhiran Z:

A[m, j] := Y[j) = Z[m+j)
A[i, n] := X[i) = Z[i+n)
A[m, n] := true

Jika Anda pertama kali mengisi batas array (A[m, j] dan A[i, n], untuk semua i, j), Anda cukup mengulang kembali ke A[0, 0] dan mengatur entri dengan tepat. Pada akhirnya A[0, 0] adalah jawaban Anda.

person Vincent van der Weele    schedule 24.11.2013

Ini didefinisikan dengan relasi perulangan berikut: -

S(i,j,k) = false

if(Z(i)==Y(k))
  S(i,j,k) = S(i,j,k)||S(i+1,j,k+1)

if(Z(i)==X(j))
  S(i,j,k) = S(i,j,k)||S(i+1,j+1,k)

Where S(i,j,k) corresponds to Z[i to end] formed by shuffle of X[j to end] and Y[K to end]

Anda harus mencoba mengkodekannya ke dalam DP sendiri.

person Vikram Bhat    schedule 24.11.2013

SOLUSI BERBASIS JAVASCRIPT

 const first = "bac";
 const second = "def"
 const third = "dabecf";

function createDict(seq,str){
   let strObj = {};
   str = str.split("");
   str.forEach((letter,index)=>{
   strObj[letter] = {
       wordSeq: seq,
       index : index

   } ;
   })
   return strObj;
 }

function checkShuffleValidity(thirdWord,firstWord,secondWord){
    let firstWordDict = createDict('first',firstWord);
    let secondWordDict = createDict('second',secondWord);
    let wordDict = {...firstWordDict,...secondWordDict};
    let firstCount=0,secondCount = 0;
    thirdWord = thirdWord.split("");
    for(let i=0; i<thirdWord.length; i++){
        let letter = thirdWord[i];
         if(wordDict[letter].wordSeq == "first"){
      if(wordDict[letter].index === firstCount){
         firstCount++;
      }else{
        return false
      }        
    }else{
    if(wordDict[letter].index === secondCount){
      secondCount++;
    }else{
      return false;
    }

    }
}  
return true;
}

 console.log(checkShuffleValidity(third,first,second));
person srujan chakravarthy    schedule 13.01.2020

Poin-poin penting:

  1. Semua string tidak boleh nol atau kosong.
  2. Jumlah panjang 2 senar harus sama dengan senar ketiga.
  3. String ketiga tidak boleh berisi substring dari 2 string.
  4. Jika tidak, buat array karakter, urutkan, dan bandingkan.

Kode:

public static boolean validShuffle(String first, String second, String third){
  boolean status=false;
  if((first==null || second==null || third==null) || (first.isEmpty()|| second.isEmpty() || third.isEmpty())){
    status = false;
  } else if((first.length()+second.length()) !=third.length()){
    //check if the sum of 2 lengths equals to the third string length
    status = false;
  } else if(third.indexOf(first,0)!=-1 || third.indexOf(second,0)!=-1){
    //check if the third string contains substrings
    status = false;
  } else {
    char [] c1_2=(first+second).toCharArray();
    char [] c3 =third.toCharArray();
    Arrays.sort(c1_2);
    Arrays.sort(c3);
    status=Arrays.equals(c1_2, c3);
  }
  return status;
}
person siyabonga mdletshe    schedule 17.06.2016