2018 滴滴出行校招笔试(单词纠错)

题目就是整行读入空格间隔的一组字符串,然后第一个字符串为匹配串,题意就是让根据后面的字符串和第一个字符串的最小编辑距离排序,不过麻烦的是这是一个带权编辑距离,普通的最小编辑距离所有操作权值为1,所以稍微修改一下就可以了,看代码其实思路还是挺清晰的

PS. 其实用python写起来超简单的,代码就不贴了

#include<algorithm>
#include<iostream>
#include<string>
#include<map>
using namespace std;
map<char, int>mp;
string x, num[1005];
int len, vis[1005][1005];
void init() {
	mp['q'] = mp['w'] = mp['e'] = mp['r'] = mp['t'] = 1;
	mp['a'] = mp['s'] = mp['d'] = mp['f'] = mp['g'] = 1;
	mp['z'] = mp['x'] = mp['c'] = mp['v'] = 1;
}
int ld(string x, string y) {
	memset(vis, 0x3f3f3f3f, sizeof(vis));
	vis[0][0] = 0;
	for (int a = 0; a < x.size(); a++)
		vis[a + 1][0] = (a + 1) * 3;
	for (int b = 0; b < y.size(); b++)
		vis[0][b + 1] = (b + 1) * 3;
	for(int a=0;a<x.size();a++)
		for (int b = 0; b < y.size(); b++) {
			if (x[a] == y[b])
				vis[a + 1][b + 1] = min(vis[a + 1][b + 1], vis[a][b]);
			else
				vis[a + 1][b + 1] = min(vis[a + 1][b + 1], vis[a][b] + 1 + abs(mp[x[a]] - mp[y[b]]));
			vis[a + 1][b + 1] = min(vis[a + 1][b + 1], vis[a][b + 1] + 3);
			vis[a + 1][b + 1] = min(vis[a + 1][b + 1], vis[a + 1][b] + 3);
		}
	return vis[x.size()][y.size()];
}
int cmp(string x, string y) {
	return ld(x,num[0]) < ld(y,num[0]);
}
int main() {
	init();
	while (getline(cin, x)) {
		len = 0;
		string y="";
		for (int a = 0; a < x.size(); a++)
			if (x[a] != ' ')
				y += x[a];
			else if (y != "")
				num[len++] = y, y = "";
		if (y != "")
			num[len++] = y, y = "";
		sort(num+1, num + len, cmp);
		cout << num[1] << " " << num[2] << " " << num[3] << endl;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值