某农业学校 算法设计与分析-实验综合

1. 编辑距离

【问题描述】

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数。

你可以对一个单词进行如下三种操作:

  • 插入一个字符

  • 删除一个字符

  • 替换一个字符


【输入形式】

输入共包含两行,每行1个字符串,分别表示word1和word2。

【输出形式】

输出1个整数,表示将word1转换为word2所使用的最少操作数。
【样例输入】

horse

ros
【样例输出】

3

#include<bits/stdc++.h>
using namespace std;
string s1,s2;

int dfs(string a1,string a2,int i,int j)
{
	if(i==-1) return j+1;
	if(j==-1) return i+1;
	if(a1[i]==a2[j])
	{
		return dfs(a1,a2,i-1,j-1);
	}
	else
	{
		return min(min(dfs(a1,a2,i-1,j),dfs(a1,a2,i,j-1)),
		dfs(a1,a2,i-1,j-1))+1;
	}
}

int main()
{
	cin>>s1>>s2;
	cout<<dfs(s1,s2,s1.length()-1,s2.length()-1);
	return 0;
}

2. 复原 IP 地址

【问题描述】有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"和"192.168.1.312" 是 无效 IP 地址。

给定一个只包含数字的字符串s,用以表示一个IP地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你不能重新排序或删除s中的任何数字。你可以按任何顺序返回答案。

【输入形式】输入一行包含一个字符串s,表示待复原的IP地址。
【输出形式】输出包含若干行。每行一个字符串,表示一种有效的IP地址表示方案。
【样例输入】

25525511135

【样例输出】

255.255.11.135

255.255.111.35

#include<bits/stdc++.h>
using namespace std;
string c;
vector<string> res;

bool judge(string const& s,int start,int end)
{
	if(start>end) return false;
	if(s[start]=='0' && start!=end) return false;
	int num=0;
	for(int i=start;i<=end;i++)
	{
		if(s[i]>'9' || s[i]<'0') return false;
		num=num*10+(s[i]-'0');
		if(num>255) return false;
	}
	return true;
}

void back(string& s,int k,int start)
{
	if(k==3)
	{
		if(judge(s,start,s.size()-1))
		{
			res.push_back(s);
		}
		return ;
	}
	else
	{
		for(int i=start;i<s.size();i++)
		{
			if(judge(s,start,i))
			{
				s.insert(s.begin()+i+1,'.');
				k++;
				back(s,k,i+2);
				k--;
				s.erase(s.begin()+i+1);
			}
			else break;
		}
	}
}

vector<string> get(string s)
{
	if(s.size()<4 || s.size()>12) return res;
	back(s,0,0);
	return res;
}

int main()
{
	cin >>c;
	res=get(c);
	for(int i=0;i<res.size();i++)
	{
		cout << res[i]<<endl;
	}
	return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值