题目描述:
为了获取企业信息,有时会从网上爬取企业相关数据。但是因为各种原因,网络文本中的企业名称可能为不标准的企业名称。为了将舆情中的企业名称与标准的企业名称匹配起来,可能需要人工确认。
为了提高确认的效率,我们需要编写一个程序找到不标准的企业名称与标准企业名称相似度很高的非标准企业名称。
相似度的满足标准是:非标准企业名称与标准企业名称之间通过增加或者删除或者修改一个字符后与标准企业名称相同,如果两个企业名称相同不满足相似度标准。
例如:“招引网络科技”和“招银网络科技”只需修改一步将前者的“引”字修改为”银”即可,满足相似度标准。
现在需要编写如下实现该过程的核心程序
判断两个企业名称是否满足相似度标准,输出 String类型的1代表符合相似度标准,输出 String类型的0代表不符合标准。
(为了简化编程企业名称只包含数字或英文字母)
【输入:】
第一行是一个字符串,该字符串只包含数字和英文字母,字符串长度小于256
第二行是与第一行输入规则一样的字符串
【输出:】
根据输入返回 String类型的结果,1代表符合相似度标准,0代表不符合标准
样例输入:
Abcd
Abc
样例输出:1
思路:
两个字符串相等时,输出为0(代表不符合标准)
不相等:
- 字符串长度值相差>1,输出0;
- 字符串长度值相等,计算不相等的字符个数,大于1,输出为0;
- 字符串长度值相差1,计算不相等的字符个数,大于1,输出为0;
字符串长度值相差1,计算不相等的字符个数:
设置两个下表,分别指向两个字符串的第一个字符,
- 相等,同时向前移动下标;
- 不相等,移动一个,查看是否相等,增加计数器;
- 移动任意一个都不相等,则下表同时移动,增加计数器。
如果计数器的值大于1,说明不对应的字符大于2个,输出0。
#include<iostream>
#include<string>
using namespace std;
int similar(string s1, string s2)
{
if (s1 == s2)
return 0;
int s1len = s1.length();
int s2len = s2.length();
if (abs(s1len - s2len) > 1)
return 0;
int i = 0, j = 0;
int count = 0;
if (s1len == s2len)
{
while (i < s1len && j < s2len)
{
if (s1[i] != s2[j])
{
count++;
}
i++;
j++;
}
if (count > 1)
return 0;
}
else
{
while (i < s1len && j < s2len)
{
// cout << "i:"<<i << endl;
// cout << "j:"<<j << endl;
if (s1[i] == s2[j]){}
else if ((s1[i + 1] == s2[j]))
{
i = i + 1;
count++;
}
else if ((s1[i] == s2[j + 1]))
{
count++;
j = j + 1;
}
else //连续两个及其以上不相等
count++;
i++;
j++;
}
if (i != s1len || j != s2len)
count++;
if (count > 1)
return 0;
}
return 1;
}
int main()
{
string s1, s2;
cin >> s1;
cin >> s2;
cout << similar(s1, s2);
return 0;
}