📌  相关文章
📜  生成来自所有给出的字符串相差只有一个字符的字符串

📅  最后修改于: 2021-10-25 06:28:16             🧑  作者: Mango

给出的字符串STR []的长度为N的阵列,由相同长度的字符串,任务是找到字符串仅由一个字符从所有给定的字符串不同。如果无法生成这样的字符串,则打印-1 。如果有多个可能的答案,请打印其中任何一个。

例子:

处理方法:按照以下步骤解决问题:

  • 将第一个字符串设置为答案。
  • 现在,将字符串的第一个字符替换为所有可能的字符,并检查它是否与其他字符串仅相差一个字符。
  • 对第一个字符串中的所有字符重复此过程。
  • 如果所要求的类型的任何这样的字符串是从上述步骤发现,打印字符串。
  • 如果没有出现替换第一个字符串的单个字符生成所需类型字符串的情况,则打印 -1。

下面是上述方法的实现。

C++
// C++ Program to implement
// the above approach
#include 
#define ll long long
 
using namespace std;
 
// Function to check if a given string
// differs by a single character from
// all the strings in an array
bool check(string ans, vector& s,
           int n, int m)
{
 
    // Traverse over the strings
    for (int i = 1; i < n; ++i) {
 
        // Stores the count of characters
        // differing from the strings
        int count = 0;
        for (int j = 0; j < m; ++j) {
            if (ans[j] != s[i][j])
                count++;
        }
 
        // If differs by more than one
        // character
        if (count > 1)
            return false;
    }
 
    return true;
}
 
// Function to find the string which only
// differ at one position from the all
// given strings of the array
string findString(vector& s)
{
 
    // Size of the array
    int n = s.size();
 
    // Length of a string
    int m = s[0].size();
 
    string ans = s[0];
 
    int flag = 0;
 
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < 26; ++j) {
 
            string x = ans;
 
            // Replace i-th character by all
            // possible characters
            x[i] = (j + 'a');
 
            // Check if it differs by a
            // single character from all
            // other strings
            if (check(x, s, n, m)) {
                ans = x;
                flag = 1;
                break;
            }
        }
 
        // If desired string is obtained
        if (flag == 1)
            break;
    }
 
    // Print the answer
    if (flag == 0)
        return "-1";
    else
        return ans;
}
 
// Driver code
int main()
{
 
    vector s = { "geeks", "teeds" };
 
    // Function call
    cout << findString(s) << endl;
}


Java
// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
     
// Function to check if a given string
// differs by a single character from
// all the strings in an array
static boolean check(String ans, String[] s,
                     int n, int m)
{
     
    // Traverse over the strings
    for(int i = 1; i < n; ++i)
    {
         
        // Stores the count of characters
        // differing from the strings
        int count = 0;
        for(int j = 0; j < m; ++j)
        {
            if (ans.charAt(j) != s[i].charAt(j))
                count++;
        }
 
        // If differs by more than one
        // character
        if (count > 1)
            return false;
    }
    return true;
}
 
// Function to find the string which only
// differ at one position from the all
// given strings of the array
static String findString(String[] s)
{
     
    // Size of the array
    int n = s.length;
    String ans = s[0];
     
    // Length of a string
    int m = ans.length();
 
    int flag = 0;
 
    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < 26; ++j)
        {
            String x = ans;
 
            // Replace i-th character by all
            // possible characters
            x = x.replace(x.charAt(i), (char)(j + 'a'));
 
            // Check if it differs by a
            // single character from all
            // other strings
            if (check(x, s, n, m))
            {
                ans = x;
                flag = 1;
                break;
            }
        }
 
        // If desired string is obtained
        if (flag == 1)
            break;
    }
 
    // Print the answer
    if (flag == 0)
        return "-1";
    else
        return ans;
}
 
// Driver code
public static void main(String []args)
{
    String s[] = { "geeks", "teeds" };
 
    // Function call
    System.out.println(findString(s));
}
}
 
// This code is contributed by chitranayal


Python3
# Python3 program to implement
# the above approach
 
# Function to check if a given string
# differs by a single character from
# all the strings in an array
def check(ans, s, n, m):
 
    # Traverse over the strings
    for i in range(1, n):
 
        # Stores the count of characters
        # differing from the strings
        count = 0
        for j in range(m):
            if(ans[j] != s[i][j]):
                count += 1
 
        # If differs by more than one
        # character
        if(count > 1):
            return False
 
    return True
 
# Function to find the string which only
# differ at one position from the all
# given strings of the array
def findString(s):
 
    # Size of the array
    n = len(s)
 
    # Length of a string
    m = len(s[0])
 
    ans = s[0]
    flag = 0
 
    for i in range(m):
        for j in range(26):
            x = list(ans)
 
            # Replace i-th character by all
            # possible characters
            x[i] = chr(j + ord('a'))
 
            # Check if it differs by a
            # single character from all
            # other strings
            if(check(x, s, n, m)):
                ans = x
                flag = 1
                break
 
        # If desired string is obtained
        if(flag == 1):
            break
 
    # Print the answer
    if(flag == 0):
        return "-1"
    else:
        return ''.join(ans)
 
# Driver Code
 
# Given array of strings
s = [ "geeks", "teeds" ]
 
# Function call
print(findString(s))
 
# This code is contributed by Shivam Singh


C#
// C# program to implement
// the above approach
using System;
class GFG{
     
// Function to check if a given string
// differs by a single character from
// all the strings in an array
static bool check(String ans, String[] s,
                  int n, int m)
{
     
    // Traverse over the strings
    for(int i = 1; i < n; ++i)
    {
         
        // Stores the count of characters
        // differing from the strings
        int count = 0;
        for(int j = 0; j < m; ++j)
        {
            if (ans[j] != s[i][j])
                count++;
        }
 
        // If differs by more than one
        // character
        if (count > 1)
            return false;
    }
    return true;
}
 
// Function to find the string which only
// differ at one position from the all
// given strings of the array
static String findString(String[] s)
{
     
    // Size of the array
    int n = s.Length;
    String ans = s[0];
     
    // Length of a string
    int m = ans.Length;
 
    int flag = 0;
 
    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < 26; ++j)
        {
            String x = ans;
 
            // Replace i-th character by all
            // possible characters
            x = x.Replace(x[i], (char)(j + 'a'));
 
            // Check if it differs by a
            // single character from all
            // other strings
            if (check(x, s, n, m))
            {
                ans = x;
                flag = 1;
                break;
            }
        }
 
        // If desired string is obtained
        if (flag == 1)
            break;
    }
 
    // Print the answer
    if (flag == 0)
        return "-1";
    else
        return ans;
}
 
// Driver code
public static void Main(String []args)
{
    String []s = { "geeks", "teeds" };
 
    // Function call
    Console.WriteLine(findString(s));
}
}
 
// This code is contributed by Rajput-Ji


Javascript


输出:
teeks

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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程