它实际上是用Java实现的,因为你可以使用Comparator和内置方法对字符数组进行排序并比较这样的字符串:
public class AnagramComparator implements Comparator<String> {
public String sortChars(String s) {
char[] content = s.toCharArray();
Arrays.sort(content);
return new String(content);
}
public int compare(String s1, String s2) {
return sortChars(s1).compareTo(sortChars(s2));
}
}
但是我想知道如何在C ++中实现它? 编写上述Java代码中使用的内置方法的C ++等价物绝对是一种选择。还有其他智能方式吗?
答案 0 :(得分:5)
显而易见且最好的方式与您在Java中选择的方式非常相似:实现自定义比较器。
在C ++中,这是一个小于谓词的特化:
struct less_than_sorted_anagram {
bool operator ()(std::string a, std::string b) {
std::sort(a.begin(), a.end());
std::sort(b.begin(), b.end());
return a < b;
}
};
并称之为:
std::vector<std::string> range;
// …
std::sort(range.begin(), range.end(), less_than_sorted_anagram());
但是(就像你的Java代码一样)这是非常低效的,因为必须重复计算排序的字谜。只计算一次(比如第一次使用)并缓存它们会更有效率。
例如,您可以将less_than_sorted_anagram
谓词中的此缓存维护为std::map<std::string, std::string>
(或将字符串映射到字符串的类似字典)。
答案 1 :(得分:1)
两级方法:
将字符串s
排序为已排序的字符串t
,并将map<string, vector<string>
的条目添加为m[t].push_back(s);
。然后,地图的每个条目都是相互字母组合的矢量。
你可以在单个平面多图中实现相同的逻辑,但这会更加昂贵(因为你每次都必须对字符串进行排序);或者你可以制作一个比较器,按字典顺序比较排序的字符串第一个和实际的字符串秒,但这又是非常昂贵的。