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;
    }
};

猜你喜欢

转载自www.cnblogs.com/left4back/p/10459427.html
今日推荐