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;
}