匹配(字符串匹配)

时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
有两个由小写字母组成的字符串,你可以通过将字符串末尾的字母移动到开头这样的操作以使两个字符串尽可能的匹配。输出最多有几位相同。
输入
第一行一个正整数n(n≤1000),表示字符串的长度。
接下来分别是两行字符串。

输出
第一行一个整数n,表示通过变换操作后两字符串最大匹配位数,没有则输出0。
样例输入 Copy

5
abaab
bbaca

样例输出 Copy

3

提示
第一串可以操作3次得到aabab
第二串可以操作1次得到abbac
其中第1位、第3位、第4位的字母都匹配了,所以输出3。
字符串匹配问题。
直接遍历、移位、匹配的话一定会超时,下面采用一种比较巧的方法。《数据结构与算法》这门课在讲队列的ADT时,如果单纯地采用顺序线性表的话,对于“假溢出”的情况,队列空和队列满都有些问题需要解决,因此考虑把队列看成环。形成环可以采用模运算(i%maxSize)的方法,避免了越界访问,同时也能访问对应的元素。
回到这个题目,首先可以明确每个字符串的元素个数是不变的,因此“环”的大小是不变的,每进行一次操作,“环”中原来的第一个元素后移一位。问题就转换成了匹配2个“环”,具体做法是先定住“环”s的一个元素下标,然后从这个位置开始,围绕2个环一圈匹配所有元素,统计相等的个数,然后将“环”s顺时针旋转一个位置,相当于从当前下标的下一个位置开始匹配,再次匹配一圈的元素,直到遍历“环”s的所有元素。
解释一下样例:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    
    
    int n,i,j,cnt=0,mmax=0;
    string s,t;
    cin>>n;
    cin>>s>>t;
    for(i=0;i<=n-1;i++)
    {
    
    
        cnt=0;
        for(j=0;j<=n-1;j++)
        {
    
    
            if(s[(i+j)%n]==t[j])cnt++;//(i+j)%n形成环
        }
        mmax=max(cnt,mmax);
    }
    cout<<mmax;
    return 0;
}
/**************************************************************
    Language: C++
    Result: 正确
    Time:17 ms
    Memory:2024 kb
****************************************************************/

猜你喜欢

转载自blog.csdn.net/upc122/article/details/105567336