ตรวจสอบว่าสตริงเป็นการสับเปลี่ยนของสตริงที่กำหนดอีกสองสตริงหรือไม่

นี่เป็นคำถามจาก คู่มือการออกแบบอัลกอริทึม:

สมมติว่าคุณได้รับสตริงอักขระสามสาย: X, Y และ Z โดยที่ |X| = n, |Y| = m และ |Z| = n+m. Z ถือเป็นการสับเปลี่ยนของ X และ Y ถ้าหาก Z สามารถสร้างขึ้นได้โดยการแทรกอักขระจาก X และ Y ในลักษณะที่รักษาการเรียงลำดับอักขระจากแต่ละสตริงจากซ้ายไปขวา

ให้อัลกอริทึมการเขียนโปรแกรมแบบไดนามิกที่มีประสิทธิภาพซึ่งกำหนดว่า Z เป็นการสับเปลี่ยนของ X และ Y

คำแนะนำ: ค่าของเมทริกซ์การเขียนโปรแกรมแบบไดนามิกที่คุณสร้างควรเป็นบูลีน ไม่ใช่ตัวเลข

นี่คือสิ่งที่ฉันลอง:

ในตอนแรก ฉันสร้างอาร์เรย์ถ่าน 1 มิติและตัวชี้ไปยังอักขระเริ่มต้นของ X,Y,Z ตามลำดับ หากตัวชี้ Z ตรงกับ X-pointer store X ในอาร์เรย์ถ่าน มิฉะนั้น ให้ตรวจสอบแบบเดียวกันกับตัวชี้ Y หากแต่ละรายการในอาร์เรย์อักขระไม่แตกต่างจากรายการสุดท้าย Z จะไม่ถูกแทรก

ใครสามารถช่วยฉันด้วยปัญหานี้?


person piyukr    schedule 24.11.2013    source แหล่งที่มา
comment
โปรดแสดงสิ่งที่คุณได้ลอง   -  person Abhishek Bansal    schedule 24.11.2013
comment
@ Mörre ไม่นี่ไม่ใช่การบ้านของฉัน ฉันได้อ้างอิงเฉพาะคู่มือการออกแบบอัลกอริทึมเท่านั้น   -  person piyukr    schedule 24.11.2013
comment
คุณจะต้องแสดงความพยายามด้วยตัวเองหากคุณต้องการการตอบรับที่ดีจาก SO   -  person Abhishek Bansal    schedule 24.11.2013
comment
@ AbhishekBansal นี่คือสิ่งที่ฉันลอง: เริ่มแรกฉันสร้างอาร์เรย์ถ่าน 1 มิติและตัวชี้ไปยังอักขระเริ่มต้นของ X, Y, Z ตามลำดับ หากตัวชี้ Z ตรงกับ X-pointer store X ในอาร์เรย์ถ่าน มิฉะนั้น ให้ตรวจสอบแบบเดียวกันกับตัวชี้ Y หากแต่ละรายการในอาร์เรย์อักขระไม่แตกต่างจากรายการสุดท้าย Z จะไม่ถูกแทรก   -  person piyukr    schedule 24.11.2013


คำตอบ (5)


แนวทางต่อไปนี้ควรให้แนวคิดแก่คุณ

กำหนดเงื่อนไข d(s1,s2,s3) = (s1 + s2 == s3) { s3 is a shuffle of s1 and s2 }

เราต้องหา d( X, Y, Z )

ถ้าความยาวของ s1 และ s2 เท่ากับ 1 และความยาวของ s3 = 2

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

ในทำนองเดียวกัน d สามารถรับได้สำหรับสตริงว่าง

สำหรับสตริงที่มีความยาวตามต้องการ ให้ยึดตามความสัมพันธ์

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] )
                }

คุณสามารถคำนวณรายการ d() โดยเริ่มจากสตริงที่มีความยาวเป็นศูนย์และตรวจสอบต่อไป

person Abhishek Bansal    schedule 24.11.2013
comment
ไม่ได้หมายความว่าอักขระที่ต่อเนื่องกันใน Z จะต้องมาจาก X และ Y หรืออีกทางหนึ่ง ? - person piyukr; 24.11.2013
comment
ไม่ การแทรกสลับหมายความว่า Z ควรมีอักขระทั้งหมดใน X และ Y และอยู่ในลำดับเดียวกับที่อยู่ในสตริงที่เกี่ยวข้อง ตัวอย่างเช่น abc และ def และถูกแทรกเพื่อสร้าง abcdef - person Abhishek Bansal; 24.11.2013

ขั้นแรก เรามาเริ่มด้วยคำจำกัดความบางประการกันก่อน ฉันเขียน X[i] สำหรับองค์ประกอบ ith ของ X และ X[i) สำหรับสตริงย่อยของ X เริ่มต้นที่ดัชนี i

ตัวอย่างเช่น ถ้า X = abcde แล้วก็ X[2] = c และ X[2) = cde

คำจำกัดความที่คล้ายกันถือเป็น Y และ Z


ในการแก้ปัญหาด้วยการเขียนโปรแกรมแบบไดนามิก คุณควรเก็บอาร์เรย์บูลีน 2D A ขนาด (n+1) x (m+1) ไว้ ในอาร์เรย์นี้ A[i, j] = true ก็ต่อเมื่อ X[i) และ Y[j) สามารถแทรกลงในรูปแบบ Z[i+j) ได้

สำหรับ (i, j) ตามอำเภอใจ ที่ใดที่หนึ่งตรงกลางอาร์เรย์ 2D ความสัมพันธ์การเกิดซ้ำนั้นง่ายมาก:

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

ที่ขอบของอาร์เรย์ 2D คุณจะมีกรณีที่ X หรือ Y อยู่ที่จุดสิ้นสุดอยู่แล้ว ซึ่งหมายความว่าส่วนต่อท้ายของอีกส่วนควรเท่ากับส่วนต่อท้ายของ Z:

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

หากคุณเติมเส้นขอบของอาร์เรย์ก่อน (A[m, j] และ A[i, n] สำหรับ i, j ทั้งหมด) คุณสามารถวนกลับไปที่ A[0, 0] และตั้งค่ารายการอย่างเหมาะสม ท้ายที่สุด A[0, 0] คือคำตอบของคุณ

person Vincent van der Weele    schedule 24.11.2013

มันถูกกำหนดโดยความสัมพันธ์ที่เกิดซ้ำดังต่อไปนี้: -

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]

คุณควรลองเขียนโค้ดสิ่งนี้ลงใน DP ด้วยตัวคุณเอง

person Vikram Bhat    schedule 24.11.2013

โซลูชั่นที่ใช้ 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

ประเด็นสำคัญ:

  1. สตริงทั้งหมดไม่ควรเป็นค่าว่างหรือว่างเปล่า
  2. ผลรวมของความยาว 2 สายควรเท่ากับสายที่สาม
  3. สตริงที่สามไม่ควรมีสตริงย่อยของ 2 สตริง
  4. หรือสร้างอาร์เรย์ของอักขระ จัดเรียงและเปรียบเทียบ

รหัส:

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