📌  相关文章
📜  Q查询的[L,R]范围内给定字符串的字典最小变位词

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

Q查询的[L,R]范围内给定字符串的字典最小变位词

给定一个大小为N的字符串S和一个数组queries ,其中包含LR形式的Q个查询。任务是为每个查询找到从LR的字符串中字典顺序最小的字谜。

例子:

方法:这个问题可以通过预先计算出现在字符串 S 中第 i 个索引处的所有字符的频率来解决因为这样,在每个查询中计算LR之间字符的频率更容易也更省时。现在,要解决这个问题,请按照以下步骤操作:

  • 创建一个函数preComputeFreq ,它将为每个索引i存储字符串S中字符的频率。
  • 创建一个名为minimumAnagram的函数并为每个查询运行它。在这个函数中:
    • 创建一个字符串ans ,它将存储从LR的字典顺序最小的字谜。
    • 找到频率,直到索引R和直到索引L-1 ,以获得LR之间的频率。
    • 从 0 到该字符的频率运行一个循环,并将其添加到字符串ans中。
    • 返回字符串ans作为每个查询的答案。
  • 根据以上观察打印答案。

下面是上述方法的实现:

C++14
// C++ program for the above approach
 
#include 
using namespace std;
 
// Function to calculate the frequencies of all
// characters till each index in string
void preComputeFreq(string& S,
                    vector >& freq)
{
    vector f(26, 0);
    for (int i = 0; i < S.size(); ++i) {
        freq[i] = f;
        freq[i][S[i] - 'a']++;
 
        f = freq[i];
    }
}
 
// Function to get the
// smallest anagram from L to R
string smallestAnagram(string& S, int L, int R,
                       vector >& freq)
{
    string ans;
 
    // Finding net frequencies
    // of character from L to R
    for (int i = 0; i < 26; i++) {
        int low = 0;
        if (L > 0) {
            low = freq[L - 1][i];
        }
 
        // Adding characters to string ans
        for (int j = 0; j < freq[R][i] - low; j++) {
            ans += (char)('a' + i);
        }
    }
 
    return ans;
}
 
void smallestAnagramUtil(string& S, int N,
                         vector >& queries)
{
    vector > freq(N, vector(26, 0));
    preComputeFreq(S, freq);
 
    for (auto x : queries) {
        int L = x.first;
        int R = x.second;
        cout << smallestAnagram(S, L, R, freq)
          << endl;
    }
}
 
// Driver Code
int main()
{
    string S = "bbdfaaacaed";
    int N = S.size();
    vector > queries
        = { { 0, 4 }, { 4, 8 } };
    smallestAnagramUtil(S, N, queries);
}


Javascript


输出
abbdf
aaaac

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