给定两个长度分别为N和M 的字符串S和T ,任务是计算从两个字符串中获得相同长度子字符串的方法的数量,以便它们具有单个不同的字符。
例子:
Input: S = “ab”, T = “bb”
Output: 3
Explanation: The following are the pairs of substrings from S and T differ by a single character:
- (“a”, “b”)
- (“a”, “b”)
- (“ab”, “bb”)
Input: S = “aba”, T = “baba”
Output: 6
朴素的方法:最简单的方法是从给定的字符串生成所有可能的子字符串,然后计算所有可能的相同长度的子字符串对,这些子字符串可以通过更改单个字符来变得相等。
时间复杂度: 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 condition
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 condition
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 condition
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 condition
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
Javascript
输出:
6
时间复杂度: O(N*M)
辅助空间: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。