根据给定模式从给定句子中选择单词形成的字典上最大的字符串
给定一个句子S和一个具有不同字符的字符串B ,根据给定的条件通过连接S的单词来找到一个字符串:-
- 从S中选择一个单词 if
- 它至少有来自字符串B的length(B)/2 个字符或
- 至少有一个字符串B 中的字符,并按字典顺序升序排序。
- 形成的字符串应该是字典上最大的字符串。
例子:
Input: S = “peek geek suv”, B = “ekps”
Output: suvpeekgeek
Explanation: “suv” has one character from B and sorted in increasing order.
Whereas “peek” and “geek” has length(B)/2 characters.
Input: S = “peek fit and run”, B = “ekta”
Output: peekfit
天真的方法:可以通过将字符串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)