📌  相关文章
📜  检查字符串是否包含不包含字符X 的长度为 K 的字谜

📅  最后修改于: 2021-10-27 19:03:04             🧑  作者: Mango

给定一个字符串S ,任务是检查 S 是否包含一对长度为K的子字符串,它们是彼此的字谜并且其中不包含字符X。如果不存在这样的子字符串,则打印-1

例子:

方法:
这个想法是根据字符生成前缀和。请按照以下步骤解决问题:

  • 使用前缀 sum array迭代子字符串的字符串和生成频率。
  • 如果 HashMap 中已经存在具有相同字符频率的子字符串。
  • 否则,如果子字符串中字符X的频率为0 ,则将子字符串与当前子字符串的字符频率存储在HashMap 中

下面是上述方法的实现:

Java
// Java Program to implement
// the above approach
import java.util.*;
  
// Class to represent a Substring
// in terms of frequency of
// characters present in it
class Substring {
    int MOD = 1000000007;
  
    // Store count of characters
    int count[];
    Substring() { count = new int[26]; }
  
    public int hashCode()
    {
        int hash = 0;
        for (int i = 0; i < 26; i++) {
            hash += (i + 1) * count[i];
            hash %= MOD;
        }
        return hash;
    }
  
    public boolean equals(Object o)
    {
        if (o == this)
            return true;
        if (!(o instanceof Substring))
            return false;
        Substring ob = (Substring)o;
        for (int i = 0; i < 26; i++) {
            if (ob.count[i] != count[i])
                return false;
        }
        return true;
    }
}
class GFG {
  
    // Function to check anagrams
    static void checkForAnagrams(String s, int n,
                                 char X, int k)
    {
        boolean found = false;
  
        // Prefix array to store frequencies
        // of characters
        int prefix[][] = new int[n + 1][26];
        for (int i = 0; i < n; i++) {
            prefix[i][s.charAt(i) - 97]++;
        }
  
        // Generate prefix sum
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < 26; j++)
                prefix[i][j] += prefix[i - 1][j];
        }
  
        // Map to store frequencies
        HashMap map
            = new HashMap<>();
  
        // Check for anagrams
        for (int i = 0; i < n; i++) {
            if (i + k > n)
                break;
  
            // Generate frequencies of characters
            // of substring starting from i
            Substring sub = new Substring();
            for (int j = 0; j < 26; j++) {
                sub.count[j]
                    = prefix[i + k - 1][j]
                      - (i - 1 >= 0
                             ? prefix[i - 1][j]
                             : 0);
            }
  
            // Check if forbidden character is
            // present, then continue
            if (sub.count[X - 97] != 0)
                continue;
  
            // If already present in HashMap
            if (map.containsKey(sub)) {
  
                found = true;
  
                // Print the substrings
                System.out.println(
                    s.substring(map.get(sub),
                                map.get(sub) + k)
                    + " " + s.substring(i, i + k));
                break;
            }
            else {
                map.put(sub, i);
            }
        }
  
        // If no such substring is found
        if (!found)
            System.out.println("-1");
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        String s = "rotator";
        int n = s.length();
        char X = 'a';
        int k = 3;
        checkForAnagrams(s, n, X, k);
    }
}


输出:
rot tor

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