C++實現字符串拼接找到字典序最小組合問題

1. 題目描述

給定一個字符串類型的數組strs,找到一種拼接方式,使得把所有字符串拼起來之後形成的字符串具有最低的字典序。

比如:
舉例:

  1. strs=[“abc”,“de”]。可以拼成"abcde",也可以拼成"deabc",但前者字典順序更小,所以返回“abcde”

  2. strs=[“b”,“ba”]. 可以拼成“bba”和“bab”,後者字典序小,返回後者“bab”

2. 思路

我們可以藉助C++ 中sort函數幫助我們排序。一種直觀的思路就是我們可以對所有的字符串進行升序,然後在進行拼接,但是這種方法也會產生一個問題。比如’b’和’ba’進行排序,因爲自然排序的情況下,‘b’ < ‘ba’那麼拼接的結果就是’bba’。但是這不是我們想要的字典序,因爲實際上’bab’< ‘bba’,因此這種先排序在拼接的思路是不對的。那麼我們可以比較二種拼接的結果大小,然後做出正確的選擇,比如’bab’ < ‘bba’,那麼我們結果就是’bab’啦。剛好sort函數可以提供自定義的比較器,也是比較方便的。

3. 代碼

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

bool cmp(std::string& str1, std::string& str2) {
    return str1 + str2 < str2 + str2 ? true : false;
}

std::string lowestString(std::vector<std::string>& str) {
    if (str.size() == 0) return "";
    int len = str.size();
    std::string res = "";
    std::sort(str.begin(), str.end(), cmp);
    for (int i = 0; i < len; ++i) {
        res += str[i];
    }
    return res;
}
int main() {
    std::vector<std::string> str1 = {"b", "ba"};
    std::vector<std::string> str2 = { "jibw", "ji", "jp", "bw", "jibw" };
    std::string res1 = lowestString(str1);
    std::string res2 = lowestString(str2);
    std::cout << res1 << std::endl;
    std::cout << res2 << std::endl;
    return 0;

在這裏插入圖片描述

4. 參考文獻

  1. 算法編程題6-字符串拼接找到字典序最小組合問題
  2. C++裏的sort()函數的強大功能
  3. std::sort
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章