26:字串最大跨距
- 總時間限制:
- 1000ms
- 記憶體限制:
- 65536kB
- 描述
-
有三個字串S,S1,S2,其中,S長度不超過300,S1和S2的長度不超過10。想檢測S1和S2是否同時在S中出現,且S1位於S2的左邊,並在S中互不交叉(即,S1的右邊界點在S2的左邊界點的左側)。計算滿足上述條件的最大跨距(即,最大間隔距離:最右邊的S2的起始點與最左邊的S1的終止點之間的字元數目)。如果沒有滿足條件的S1,S2存在,則輸出-1。
例如,S = "abcd123ab888efghij45ef67kl", S1="ab", S2="ef",其中,S1在S中出現了2次,S2也在S中出現了2次,最大跨距為:18。 - 輸入
- 三個串:S1, S2, S3,其間以逗號間隔(注意,S1, S2, S3中均不含逗號和空格);
- 輸出
- S1和S2在S最大跨距;若在S中沒有滿足條件的S1和S2,則輸出-1。
- 樣例輸入
-
abcd123ab888efghij45ef67kl,ab,ef
- 樣例輸出
-
18
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 char s[305],s1[15],s2[15]; 6 int main() { 7 char c; 8 int len=0,len1=0,len2=0; 9 while((c=getchar())&&c!=',') 10 s[len++]=c;//輸入字元陣列s 11 while((c=getchar())&&c!=',') 12 s1[len1++]=c;//輸入字元陣列s1 13 while((c=getchar())&&c!=EOF) 14 s2[len2++]=c;//輸入字元陣列s2 15 int i,j=len2-2,k=0,ans=0; 16 for(i=0; i<len; i++) { 17 if(s[i]==s1[k]) 18 k++;//當字元陣列s1和字元陣列s的字元相同時k++,當k==len1時進行if語句 19 else { 20 k=0;//否則k重置為0,繼續尋找 21 if(s[i]==s1[k]) k++;//找到的話進行if語句 22 } 23 if(k==len1) { //如果找到了 24 ans=ans-(i+1);//如果k的長度等於s1的陣列長度則把-(i+1)賦值給ans即為s1後第一個字元位置的負值{a s d a d a d s1(z) 25 26 break;//跳出迴圈 27 } 28 } 29 for(i=len-1; i>=0; i--) { 30 //從字元陣列s的最後一個字元開始遍歷 31 if(s[i]==s2[j]) 32 j--;//從字元陣列s2倒著的第一個有效的字元算起如果和字元陣列s的字元相等的話則j-- 33 else { 34 j=len2-2;//重置為l2-2 35 if(s[i]==s2[j]) j--; 36 } 37 if(j==0) { //當找到時 38 ans=ans+(i-1);//如果j==0,則把t+(i-1)賦值給t; 39 break; 40 } 41 } 42 if(ans>=0) cout<<ans;//如果t大於0則輸出t 43 else cout<<"-1";//否則輸出-1 44 return 0; 45 }