📌  相关文章
📜  计算相同长度的子字符串,该子字符串与两个给定的字符串相差一个字符

📅  最后修改于: 2021-04-26 10:55:08             🧑  作者: Mango

给定分别为长度NM的两个字符串ST ,任务是计算从这两个字符串获得相同长度的子字符串的方式的数目,以使它们具有单个不同的字符。

例子:

天真的方法:最简单的方法是从两个给定的字符串生成所有可能的子字符串,然后计算相同长度的所有可能的子字符串对,通过更改单个字符可以使它们相等。

时间复杂度: O(N 3 * M 3 )
辅助空间: O(N 2 )

高效方法:为了优化上述方法,其思想是同时遍历给定字符串的所有字符,对于每对不同的字符,从当前不同字符的下一个索引开始,对所有等长的子字符串进行计数。打印检查所有不同字符对后获得的计数。

下面是上述方法的实现:

C++
// C++ pprogram for the above approach
#include 
using namespace std;
     
// Function to count the number of
// substrings of equal length which
// differ by a single character
 int countSubstrings(string s, string t)
{
     
    // Stores the count of
    // pairs of substrings
    int answ = 0;
 
    // Traverse the string s
    for(int i = 0; i < s.size(); i++)
    {
         
        // Traverse the string t
        for(int j = 0; j < t.size(); j++)
        {
             
            // Different character
            if (t[j] != s[i])
            {
                 
                // Increment the answer
                answ += 1;
                 
                int k = 1;
                int z = -1;
                int q = 1;
 
                // Count equal substrings
                // from next index
                while (j + z >= 0 &&
                       0 <= i + z &&
                   s[i + z] ==
                   t[j + z])
                {
                    z -= 1;
 
                    // Increment the count
                    answ += 1;
 
                    // Increment q
                    q += 1;
                }
 
                // Check the condtion
                while (s.size() > i + k &&
                       j + k < t.size() &&
                         s[i + k] ==
                         t[j + k])
                {
                     
                    // Increment k
                    k += 1;
 
                    // Add q to count
                    answ += q;
 
                    // Decrement z
                    z = -1;
                }
            }
        }
    }
     
    // Return the final count
    return answ;
}
 
// Driver Code
int main()
{
    string S = "aba";
    string T = "baba";
 
    // Function Call
    cout<<(countSubstrings(S, T));
 
}
 
// This code is contributed by 29AjayKumar


Java
// Java program for the above approach
class GFG{
     
// Function to count the number of
// subStrings of equal length which
// differ by a single character
static int countSubStrings(String s, String t)
{
     
    // Stores the count of
    // pairs of subStrings
    int answ = 0;
 
    // Traverse the String s
    for(int i = 0; i < s.length(); i++)
    {
         
        // Traverse the String t
        for(int j = 0; j < t.length(); j++)
        {
             
            // Different character
            if (t.charAt(j) != s.charAt(i))
            {
                 
                // Increment the answer
                answ += 1;
                 
                int k = 1;
                int z = -1;
                int q = 1;
 
                // Count equal subStrings
                // from next index
                while (j + z >= 0 &&
                       0 <= i + z &&
                   s.charAt(i + z) ==
                   t.charAt(j + z))
                {
                    z -= 1;
 
                    // Increment the count
                    answ += 1;
 
                    // Increment q
                    q += 1;
                }
 
                // Check the condtion
                while (s.length() > i + k &&
                       j + k < t.length() &&
                         s.charAt(i + k) ==
                         t.charAt(j + k))
                {
                     
                    // Increment k
                    k += 1;
 
                    // Add q to count
                    answ += q;
 
                    // Decrement z
                    z = -1;
                }
            }
        }
    }
     
    // Return the final count
    return answ;
}
 
// Driver Code
public static void main(String[] args)
{
    String S = "aba";
    String T = "baba";
 
    // Function Call
    System.out.println(countSubStrings(S, T));
}
}
 
// This code is contributed by gauravrajput1


Python3
# Python3 program for the above approach
 
# Function to count the number of
# substrings of equal length which
# differ by a single character
def countSubstrings(s, t):
 
    # Stores the count of
    # pairs of substrings
    answ = 0
     
    # Traverse the string s
    for i in range(len(s)):
     
        # Traverse the string t
        for j in range(len(t)):
         
            # Different character
            if t[j] != s[i]:
             
                # Increment the answer
                answ += 1
                 
                k = 1
                z = -1
                q = 1
                 
                # Count equal substrings
                # from next index
                while (
                    j + z >= 0 <= i + z and
                    s[i + z] == t[j + z]
                    ):
                 
                    z -= 1
                     
                    # Increment the count
                    answ += 1
                     
                    # Increment q
                    q += 1
 
                # Check the condtion
                while (
                    len(s) > i + k and
                    j + k < len(t) and
                    s[i + k] == t[j + k]
                    ):
 
                    # Increment k
                    k += 1
 
                    # Add q to count
                    answ += q
 
                    # Decrement z
                    z = -1
                     
    # Return the final count
    return answ
 
# Driver Code
 
S = "aba"
T = "baba"
 
# Function Call
print(countSubstrings(S, T))


C#
// C# program for the above approach
using System;
 
class GFG
{
     
// Function to count the number of
// subStrings of equal length which
// differ by a single character
static int countSubStrings(String s, String t)
{
     
    // Stores the count of
    // pairs of subStrings
    int answ = 0;
 
    // Traverse the String s
    for(int i = 0; i < s.Length; i++)
    {
         
        // Traverse the String t
        for(int j = 0; j < t.Length; j++)
        {
             
            // Different character
            if (t[j] != s[i])
            {
                 
                // Increment the answer
                answ += 1;
                 
                int k = 1;
                int z = -1;
                int q = 1;
 
                // Count equal subStrings
                // from next index
                while (j + z >= 0 &&
                       0 <= i + z &&
                   s[i + z] ==
                   t[j + z])
                {
                    z -= 1;
 
                    // Increment the count
                    answ += 1;
 
                    // Increment q
                    q += 1;
                }
 
                // Check the condtion
                while (s.Length > i + k &&
                       j + k < t.Length &&
                         s[i + k] ==
                         t[j + k])
                {
                     
                    // Increment k
                    k += 1;
 
                    // Add q to count
                    answ += q;
 
                    // Decrement z
                    z = -1;
                }
            }
        }
    }
     
    // Return the readonly count
    return answ;
}
 
// Driver Code
public static void Main(String[] args)
{
    String S = "aba";
    String T = "baba";
 
    // Function Call
    Console.WriteLine(countSubStrings(S, T));
}
}
 
// This code is contributed by 29AjayKumar


输出:
6

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