📌  相关文章
📜  根据给定模式从给定句子中选择单词形成的字典上最大的字符串

📅  最后修改于: 2022-05-13 01:56:07.092000             🧑  作者: Mango

根据给定模式从给定句子中选择单词形成的字典上最大的字符串

给定一个句子S和一个具有不同字符的字符串B ,根据给定的条件通过连接S的单词来找到一个字符串:-

  • S中选择一个单词 if
    • 它至少有来自字符串Blength(B)/2 个字符或
    • 至少有一个字符串B 中的字符,并按字典顺序升序排序。
  • 形成的字符串应该是字典上最大的字符串。

例子:

天真的方法:可以通过将字符串S和字符串B的单词存储在一个集合中并比较它们是否相等来解决该任务,但这需要多个集合,这需要额外的时间和空间。

时间复杂度: O(N * logN) 其中 N 是 S 中的字符总数
辅助空间: O(N)

有效的方法:更好的方法是使用地图。按照下面提到的步骤:

  • B的字符频率存储在无序映射中,并与数组S的字符串进行比较。
  • 如果字符串S的单词中存在两个字符,则将其添加到输出字符串中。
  • 如果只出现一个字符,则检查它是否按字典顺序升序排序。
  • 如果是,则将其添加到输出字符串。
  • 按照字典顺序排列输出字符串。

下面是上述方法的实现:

C++
// C++ code for the above approach
#include 
using namespace std;
 
// Check if sorted or not
bool isosrted(string s)
{
    for (int i = 0; i < s.size() - 1; i++) {
        if (s[i] > s[i + 1])
            return false;
    }
    return true;
}
 
// Function to get the lexicographically largest string
string choosestr(string s, string b, int n)
{
    unordered_map m;
    set > ss;
 
    // Count frequencies of characters
    for (int i = 0; b[i]; i++) {
        m[b[i]]++;
    }
    int g = b.size() / 2;
    int c = 0;
    string k = "", p;
    stringstream sg(s);
 
    // Traverse through sentence
    while (sg >> p) {
        c = 0;
        for (int j = 0; j < p.size(); j++) {
            if (m[p[j]])
                c++;
            if (c == g)
                break;
        }
 
        // Store the output according
        // to the given conditions
        if ((c == 1 and isosrted(p)) or c == g)
            ss.insert(p);
    }
 
    // Lexicographically largest string
    for (auto i : ss) {
        k += i;
    }
    return k;
}
 
// Driver code
int main()
{
    string S = "peek fit and run";
    string B = "ekta";
    int N = sizeof(S) / sizeof(S[0]);
    cout << choosestr(S, B, N);
    return 0;
}


Javascript



输出
peekfit

时间复杂度: O(N)
辅助空间: O(N)