【gmoj】【暴力】 word

这篇博客介绍了如何使用暴力枚举方法解决一个字符串处理问题:找到一组字符串中长度最短的一个,并允许最多修改d个字符,使得每个字符串都有一个长度为l的子串与答案的差异不超过d。代码实现包括C++,主要涉及字符串操作和遍历判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【gmoj】【暴力】 word

题目

在这里插入图片描述


解题思路

找出长度最短的一个字符串
枚举出它所有长度为l的字符串
枚举需要修改的位置和修改后的字符
判断这个字符串是否符合


代码

#include<iostream>
#include<cstdio>
using namespace std;
struct lzf{
	string s;
}f[52];
string w,x,y,z;
int l,d,n,len[52],ans=0;
bool check(string x)  //判断是否符合,每个字符串至少有一个子串与答案不一样的位数<=d
{   
	 for (int i=1;i<=n;i++)  
	 {
	 	 int p=0;
	 	 for (int j=l-1;j<len[i];j++)
	 	 {
	 	 	 z=f[i].s.substr(j-l+1,l);
	 	     int c=0;
	 	     for (int k=0;k<l;k++)
	 	         if (z[k]!=x[k])
	 	         	c++;
			 if (c<=d) 
			 {
			 	p=1;
			    break;
			 }
		}
		if (!p) return false; 
	 }
	 return true;
}
void solve(int j)
{
	 for (int k=0;k<26;k++)
	 {
	     x=y;
	     if (y[j]!=k+97)
	     {
	        x[j]=k+97; 
	        if (check(x)) 
		    {
			    cout<<x<<endl;
			    ans=1;
			    return;
            }
         } 
     }
}
int main()
{
	scanf("%d%d",&l,&d);
	scanf("%d",&n);
	getline(cin,f[1].s);
	for (int i=1;i<=n;i++)
	{
	    getline(cin,f[i].s);
	    len[i]=f[i].s.size();
	    if (len[i]<len[1])
	    {
	    	swap(len[i],len[1]);
	    	swap(f[i],f[1]);
		}
	}
	for (int i=l-1;i<len[1];i++)
	{
		x=f[1].s.substr(i-l+1,l); 
		w=x,y=x; 
		if (check(x)) //不修改
		{
			cout<<x;
			return 0;
        }
		if (d>=1)
	    {
	       for (int j=0;j<l;j++)  //修改一个位置
	       {
	       	   x=w;
	           solve(j);
	           if (ans) return 0;
            }
		}
		if (d==2)
		{
			for (int j=0;j<l;j++)  //修改第一个位置
				for (int k=0;k<26;k++)
				{
					x=w;
				    if (w[j]!=k+97)
				    {
				    	x[j]=k+97;
				    	y=x;
				    	for (int r=0;r<l;r++)  //修改第二个位置
				    	    if (r!=j)
				    	    {
				    	       solve(r);
				    	       if (ans) return 0;
				    	    }
					} 
				}
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值