记录一道题的解法

题目大意:给一个字符串,要求将它变成一个前向看和后向看一样的字符串,比如"racecar"就是这样一个字符串。现在做法如下,选择两个字母,比如x和y,可以要求将所有的x变成y, 每一个字母的改变都耗费一秒钟。比如:goose,选择把o变成e,会耗时两秒,字符串变成geese。现在给出一个字符串,求将s变成一个要求的字符串耗费的最小时间。


思路:将位置对应的字符链接,整个链接会形成若干棵树。我们要做的统计工作就是保留每棵树上数量最多的节点不变,将其它节点变为该节点的值。代码如下:

#include <string>
#include <iostream>
#include <time.h>
#include <sstream>
#include <math.h>
#include <exception>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <fstream>
#include <stack>
#include <limits> 
#include <numeric>

using namespace std; 

const int LEN = 27; 

int linked[LEN][LEN]; 
int cnt[LEN];
bool processed[LEN]; 

class GooseTattarrattatDiv1 {
public:
	int getmin(string s) {
		int res = 0; 
		int n = s.length();
		for (int i=0; i<n; i++) {
			linked[s[i] - 'a'][s[n - i - 1] - 'a'] = 1;
			
			cnt[s[i] - 'a']++;
		}

		for (int i=0; i<LEN; i++) {
			linked[i][i] = 1; 
		}
		
		for (int i=0; i<LEN; i++) {
			if (!processed[i]) {
				vector<int> ns; 
				for (int j=0; j<LEN; j++) {
					if (linked[i][j]) {
						ns.push_back(cnt[j]);
						processed[j] = true;
					}
				}
				sort(ns.begin(), ns.end());
				reverse(ns.begin(), ns.end()); 
				for (int j=1; j<ns.size(); j++) {
					res += ns[j];
				}
			}
		}
		
		return res;
	}
};


你可能感兴趣的:(记录一道题的解法)