LeetCode[791] 自定义字符串排序
Posted left4back
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode[791] 自定义字符串排序相关的知识,希望对你有一定的参考价值。
最近断断续续也刷了点题,但都没什么意思,印象里好像一直在递归,所以也没有特别记录。
今天这道题虽然很简单,但终于不是递归了,而且其中一位前辈的解答用到了一个我不了解的C++11特性——lambda。
lambda表达式基本形式为:
[capture list] (parameter list) -> return type {function body}
下面代码中orderMap前的&表示引用捕获。需要额外注意的一点是,只有像下面这样函数体只有一句return的形式才能省略return type,否则必须明确return type。
class Solution { public: string customSortString(string S, string T) { unordered_map<char, int> orderMap; for (int i = 0; i < S.size(); ++i) { orderMap[S[i]] = i; } sort(T.begin(), T.end(), [&orderMap](char l, char r) {return orderMap[l] < orderMap[r];}); return T; } };
lambda确实很简洁,但是很遗憾很多时候用不上,不得不说老代码有些时候是真的坑爹,根本不兼容C++11。
(这里有个问题我没有细究,stl平时用得不多,如果T中有S没有的元素,lambda函数是怎么处理的呢?)
那么当C++11不能用的时候该怎么办呢?力扣上另外一个前辈给出了答案。
class Solution { public: string customSortString(string S, string T) { string ans = ""; vector<int> v; map<char, int> m; // 字符与下标的键值对 for (int i = 0; i < S.size(); i++) { m[S[i]] = i; } for (int i = 0; i < T.size(); i++) { if (m.find(T[i]) == m.end()) { // 字符不在S中 ans += T[i]; } else { v.push_back(m[T[i]]); } } sort(v.begin(), v.end()); // 按照下标值排序 for (int i = 0; i < v.size(); i++) { ans += S[v[i]]; } return ans; } };
以上是关于LeetCode[791] 自定义字符串排序的主要内容,如果未能解决你的问题,请参考以下文章
[leetcode]791. Custom Sort String自定义排序字符串