OpenJudge NOI 1.7 30:字符环
生活随笔
收集整理的這篇文章主要介紹了
OpenJudge NOI 1.7 30:字符环
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
OpenJudge NOI 1.7 30:字符環
【題目考點】
1. 字符串
2. 環形數組遍歷
環形數組元素個數為n,下標為0~n-1,在環形數組中下標i取下一個位置的方法:i = (i + 1) % n
環形數組中下標i后第j個位置的下標為:(i + j) % n
3. 環形數組轉一維數組
一個環形數組有n個元素。如想遍歷該環形數組,同時取一段子數組做某種運算,而該子數組的長度小于等于2n,那么就可以將該環形數組變為一個長為2n的一維數組,將環形數組中的元素在一維數組上排列兩遍,而后在該一維數組上做遍歷。
例:在環形數組上找最大子段和
假設環形數組為:4 -4 2 -3 5 -3
轉為一維數組:4 -4 2 -3 5 -3 4 -4 2 -3 5 -3
其最大子段和為5-3+4=6
【解題思路】
解法1:在環形數組上遍歷
輸入兩個字符串到s1和s2,其長度分別為l1、l2。i1與i2分別為s1與s2的下標,i1從0遍歷到l1-1, i2從0遍歷到l2-1。對于每對i1, i2,看s1從i1開始,與s2從i2開始,相同的子串最長可以是多長。在這一過程中,需要使用在環形數組中取下一個位置的寫法,即形如i = (i + 1) % n的寫法。對每次取到的子串長度取最大值,即為結果。
解法2:環形數組轉為一維數組
將兩個環形字符串轉為一維字符串(方法見題目考點3),而后就是兩個一般字符串找最長公共子串的問題了,做法與解法1相似,遍歷時下標直接加1即可。
【題解代碼】
解法1:在環形數組上遍歷
#include<bits/stdc++.h> using namespace std; #define N 260 int main() {char s1[N], s2[N];int i1 = 0, i2 = 0, l1, l2, mxLen = 0;//i1, i2分別是s1, s2的下標 mxLen:最大公共子串長度 cin >> s1 >> s2;l1 = strlen(s1);l2 = strlen(s2);for(int i1 = 0; i1 < l1; ++i1)for(int i2 = 0; i2 < l2; ++i2){int j = 0;//j為公共子串長度,最長也就是l1和l2的較小值 while(j < l1 && j < l2){if(s1[(i1+j)%l1] == s2[(i2+j)%l2])//在環形數組s1中i1后第j個元素下標為(i1+j)%l1,s2中i2后第j個元素下標為(i2+j)%l2 j++;elsebreak;}mxLen = max(mxLen, j);}cout << mxLen;return 0; }解法2:環形數組轉為一維數組
#include<bits/stdc++.h> using namespace std; #define N 260 void doubleArr(char s[])//將s變為原來的s重復2遍 如將abc變為abcabc {int len = strlen(s);for(int i = 0; i <= len; ++i)s[i+len] = s[i]; } int main() {char s1[N], s2[N];int i1 = 0, i2 = 0, l1, l2, mxLen = 0;//i1, i2分別是s1, s2的下標 mxLen:最大公共子串長度 cin >> s1 >> s2;l1 = strlen(s1);l2 = strlen(s2);doubleArr(s1);//將字符串變為原字符串重復2遍,即為用一維數組表示環形數組 doubleArr(s2);for(int i1 = 0; i1 < l1; ++i1)for(int i2 = 0; i2 < l2; ++i2){int j = 0;//j為公共子串長度,最長也就是l1和l2的較小值 while(j < l1 && j < l2){if(s1[i1+j] == s2[i2+j])j++;elsebreak;}mxLen = max(mxLen, j);}cout << mxLen;return 0; }總結
以上是生活随笔為你收集整理的OpenJudge NOI 1.7 30:字符环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python timer 死掉_Pyth
- 下一篇: OpenJudge NOI 1.7 08