華為筆試:字符串的刪除次數


題目描述:

輸入兩個整數數組A和B,二者中元素都滿足唯一且無序,同時A中的元素在B中都存在,B中元素在A中也存在,即A和B僅僅元素順序可能不同,比如(1,3,5,2)和(3,2,1,5)。

現在想通過分別刪除A和B中的部分元素,使得A和B剩下的子序列完全相同,請輸出數組A需要刪除的最少元素數(注意數組B需要刪除相同數量的元素)。

輸入描述:

輸入共三行,第一行為一個整數n(1<=n<=100000),表示A和B中元素的個數。第二行為數組A,共n個整數,第三行為數組B,共n個整數。

輸出描述:

輸出一行為數組A需要刪除的元素數(包含換行)。

 

輸入:

4

1 3 5 2

3 2 1 5

輸出:

2

 

說明:

{1, 3, 5, 2}和{3, 2, 1, 5}的最長公共子序列有三個。分別為{1, 5}, {3, 5}, {3, 2},所以至少需要刪除2個元素。

 

思路分析:

首先用一個哈希表保存每個元素在A數組中的位置,接下來根據B的輸入,利用A數組來保存對應元素的B中的位置。實質上對於A,B是需要查找二者相等元素的最長上升序列。

 

代碼:

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<vector>
 4 #include<algorithm>
 5 #include<string>
 6 #include<map>
 7 #include<limits.h>
 8 #include<queue>
 9 using namespace std;
10 
11 int LIS(vector<int>&A, vector<int>&B)
12 {
13     int len=1;
14     B[0]=A[0];
15     for(int i=1; i<A.size(); i++)
16     {
17         if(A[i]>B[len-1])
18             B[len++]=A[i];
19         else
20         {
21             int p = lower_bound(B.begin(), B.begin()+len, A[i])-B.begin();
22             B[p] = A[i];
23         }
24     }
25     return len;
26 }
27 
28 int main()
29 {
30     int n;
31     cin>>n;
32     vector<int>A(n);
33     vector<int>B(n);
34     map<int, int>M;
35     for(int i=0; i<n; i++)
36     {
37         cin>>A[i];
38         M[A[i]]=i;
39     }
40     int k=0;
41     for(int i=0; i<n; i++)
42     {
43         int x;
44         cin>>x;
45         A[M[x]] = k++;
46     }
47     int ans = n-LIS(A,B);
48     cout<<ans<<endl;
49     return 0;
50 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM