Cuente las substrings de la misma longitud que difieren en un solo carácter de dos strings dadas

Dadas dos strings S y T de longitud N y M respectivamente, la tarea es contar el número de formas de obtener una substring de la misma longitud de ambas strings de manera que tengan un solo carácter diferente.

Ejemplos:

Entrada: S = «ab», T = «bb»
Salida: 3
Explicación: Los siguientes son los pares de substrings de S y T que difieren en un solo carácter:

  1. (“a”, “b”)
  2. (“a”, “b”)
  3. (“ab”, “bb”)

Entrada: S = “aba”, T = “baba”
Salida: 6

Enfoque ingenuo: el enfoque más simple es generar todas las substrings posibles a partir de las dos strings dadas y luego contar todos los pares posibles de substrings de la misma longitud que se pueden igualar cambiando un solo carácter. 

Complejidad de Tiempo: O(N 3 *M 3 )
Espacio Auxiliar: O(N 2 )

Enfoque eficiente: para optimizar el enfoque anterior, la idea es iterar sobre todos los caracteres de las strings dadas simultáneamente y para cada par de caracteres diferentes, contar todas esas substrings de igual longitud a partir del siguiente índice del carácter diferente actual. Imprime el conteo obtenido después de verificar todos los pares de caracteres diferentes.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
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

<script>
 
// Javascript program to implement
// the above approach
 
// Function to count the number of
// subStrings of equal length which
// differ by a single character
function countSubStrings(s, t)
{
      
    // Stores the count of
    // pairs of subStrings
    let answ = 0;
  
    // Traverse the String s
    for(let i = 0; i < s.length; i++)
    {
          
        // Traverse the String t
        for(let j = 0; j < t.length; j++)
        {
              
            // Different character
            if (t[j] != s[i])
            {
                  
                // Increment the answer
                answ += 1;
                  
                let k = 1;
                let z = -1;
                let 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
    let S = "aba";
    let T = "baba";
  
    // Function Call
    document.write(countSubStrings(S, T));
 
// This code is contributed by souravghosh0416.
</script>
Producción: 

6

 

Complejidad de tiempo: O(N*M*max(N,M))
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por saikumarkudikala y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *