Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ลบคอลัมน์เพื่อทำการเรียงลำดับ III ใน C ++


สมมติว่าเรามีสตริงอาร์เรย์ A ของ N แต่ละสตริงประกอบด้วยตัวอักษรพิมพ์เล็ก ทั้งหมดมีความยาวเท่ากัน ตอนนี้ เราสามารถเลือกชุดของดัชนีการลบได้ และสำหรับแต่ละสตริง เราจะลบอักขระทั้งหมดในดัชนีเหล่านั้น ตอนนี้พิจารณาว่าเราได้นำชุดของดัชนีการลบ D ไปแล้ว ซึ่งหลังจากการลบ อาร์เรย์สุดท้ายจะมีทุกองค์ประกอบในพจนานุกรม ลำดับ

เพื่อความชัดเจน A[0] อยู่ในลำดับศัพท์ (ดังนั้น A[0][0] <=A[0][1] <=... <=A[0][n - 1]), A[1 ] อยู่ในลำดับศัพท์ (เช่น A[1][0] <=A[1][1] <=... <=A[1][n - 1]) เป็นต้น (ในที่นี้ n คือขนาดของสตริง) เราต้องหาค่าต่ำสุดที่เป็นไปได้ของขนาด D

ดังนั้น หากอินพุตเป็น ["cbcdb","ccbxc"] เอาต์พุตจะเป็น 3

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ยกเลิก :=0

  • n :=ขนาดของ A

  • m :=ขนาด A[0]

  • กำหนดรายการขนาดอาร์เรย์ (m + 1) และเติมด้วย 1

  • สำหรับการเริ่มต้น i :=0 เมื่อ i

    • สำหรับการเริ่มต้น j :=0 เมื่อ j

      • โอเค :=จริง

      • สำหรับการเริ่มต้น k :=0 เมื่อ k

        • ถ้า A[k, j]> A[k, i] แล้ว

          • โอเค :=เท็จ

          • ออกจากวง

      • ถ้าตกลงไม่ใช่ศูนย์ ดังนั้น −

        • lis[i] :=สูงสุดของ lis[j] + 1 และ lis[i]

        • ret :=สูงสุดของ ret และ lis[i]

  • ถ้า ret เหมือนกับ 0 แล้ว −

    • กลับ m - 1

  • กลับ m - ret

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int minDeletionSize(vector<string>& A){
      int ret = 0;
      int n = A.size();
      int m = A[0].size();
      vector<int> lis(m + 1, 1);
      for (int i = 0; i < m; i++) {
         for (int j = 0; j < i; j++) {
            bool ok = true;
            for (int k = 0; k < n; k++) {
               if (A[k][j] > A[k][i]) {
                  ok = false;
                  break;
               }
            }
            if (ok) {
               lis[i] = max(lis[j] + 1, lis[i]);
               ret = max(ret, lis[i]);
            }
         }
      }
      if (ret == 0)
      return m - 1;
      return m - ret;
   }
};
main(){
   Solution ob;
   vector<string> v = {"cbcdb","ccbxc"};
   cout << (ob.minDeletionSize(v));
}

อินพุต

{"cbcdb","ccbxc"}

ผลลัพธ์

3