📌  相关文章
📜  检查字符串的两半是否至少有一个不同的字符

📅  最后修改于: 2021-05-04 14:32:51             🧑  作者: Mango

前面我们讨论了如何检查字符串的两半是否具有相同的字符集。现在,我们进一步扩展问题,检查字符串的两半是否至少具有一个不同的字符。
例子:

Input : baaaab
Output: No, both halves do not differ at all
The two halves contain the same characters
and their frequencies match so not different
the character exists

Input : abccpb
Output : Yes, both halves differ by at least one character

方法1:(两个计数器数组)

  • 将字符串分成两半
  • 分别遍历两个不同的半部分,并将每个字符的出现计数到两个不同的计数器数组中
  • 现在,遍历这些数组,如果这些数组在某个点上不同,我们得到的答案为“是”
C++
// C++ implementation to check if
// both halves of the string have
// at least one different character
#include 
#include 
#include 
using namespace std;
# define MAX 26
 
// Function which break string into two halves
// Counts frequency of characters in each half
// Compares the two counter array and returns
// true if these counter arrays differ
bool function(string str)
{
    int l = str.length();
     
    // Declaration and initialization
    // of counter array
    int counter1[MAX];
    int counter2[MAX];
    memset(counter1, 0, sizeof(counter1));
    memset(counter2, 0, sizeof(counter2));
     
    for (int i = 0; i < l / 2; i++)
        counter1[str[i] - 'a']++;
    for (int i = l / 2; i < l; i++)
        counter2[str[i] - 'a']++;
    for (int i = 0; i < MAX; i++)
        if (counter2[i] != counter1[i])
            return true;
     
    return false;
}
 
// Driver function
int main()
{
    string str = "abcasdsabcae";
    if (function(str))
        cout << "Yes, both halves differ"
             <<" by at least one character";
    else
        cout << "No, both halves do "
             <<"not differ at all";
    return 0;
}


Java
// Java implementaion of the problem
import java.util.*;
import java.lang.*;
 
class GeeksforGeeks {
    final static int MAX = 26;
 
    // Function which break string into two halves
    // Counts frequency of characters in each half
    // Compares the two counter array and returns
    // true if these counter arrays differ
    static boolean function(String str)
    {
        int l = str.length();
 
        // Declaration and initialization
        // of counter array
        int counter1[] = new int[MAX];
        int counter2[] = new int[MAX];
        for (int i = 0; i < MAX; i++) {
            counter1[i] = 0;
            counter2[i] = 0;
        }
 
        for (int i = 0; i < l / 2; i++)
            counter1[str.charAt(i) - 'a']++;
        for (int i = l / 2; i < l; i++)
            counter2[str.charAt(i) - 'a']++;
        for (int i = 0; i < MAX; i++) {
            if (counter2[i] != counter1[i])
                return true;
        }
        return false;
    }
 
    // Driver function
    public static void main(String args[])
    {
        String str = "abcasdsabcae";
        if (function(str))
            System.out.print("Yes, both halves "+
            "differ by at least one character");
        else
            System.out.print("No, both halves "+
            "do not differ at all");
    }
}


Python3
# Python implementation to check if
# both halves of the string have
# at least one different character
 
MAX = 26
 
# Function which break string into two halves
# Counts frequency of characters in each half
# Compares the two counter array and returns
# true if these counter arrays differ
def function(st):
    global MAX
    l = len(st)
     
    # Declaration and initialization
    # of counter array
    counter1, counter2 = [0] * MAX, [0] * MAX
     
    for i in range(l//2):
        counter1[ord(st[i]) - ord('a')] += 1
 
    for i in range(l//2, l):
        counter2[ord(st[i]) - ord('a')] += 1
 
    for i in range(MAX):
        if (counter2[i] != counter1[i]):
            return True
    return False
 
 
# Driver function
st = "abcasdsabcae"
if function(st): print("Yes, both halves differ ",
                       "by at least one character")
else: print("No, both halves do not differ at all")
 
# This code is contributed by Ansu Kumari


C#
// C# implementation to check if
// both halves of the string have
// at least one different character
 
 
using System;
 
class GeeksforGeeks {
    static int MAX = 26;
 
    // Function which break string into two halves
    // Counts frequency of characters in each half
    // Compares the two counter array and returns
    // true if these counter arrays differ
    static bool function(String str)
    {
        int l = str.Length;
 
        // Declaration and initialization
        // of counter array
        int []counter1 = new int[MAX];
        int []counter2 = new int[MAX];
        for (int i = 0; i < MAX; i++)
        {
            counter1[i] = 0;
            counter2[i] = 0;
        }
 
        for (int i = 0; i < l / 2; i++)
            counter1[str[i] - 'a']++;
        for (int i = l / 2; i < l; i++)
            counter2[str[i] - 'a']++;
        for (int i = 0; i < MAX; i++) {
            if (counter2[i] != counter1[i])
                return true;
        }
        return false;
    }
 
    // Driver function
    public static void Main()
    {
        String str = "abcasdsabcae";
        if (function(str))
            Console.WriteLine("Yes, both halves "+
            "differ by at least one character");
        else
            Console.WriteLine("No, both halves "+
            "do not differ at all");
    }
}
 
//This code is contributed by vt_m.


PHP


Javascript


C++
// C++ implementation to check if
// both halves of the string have
// at least one different character
#include 
#include 
#include 
using namespace std;
# define MAX 26
 
// Function which break string into two halves
// Increments frequency of characters for first half
// Decrements frequency of characters for second half
// true if any index has non-zero value
bool function(string str)
{
    int l = str.length();
     
    // Declaration and initialization
    // of counter array
    int counter[MAX];
    memset(counter, 0, sizeof(counter));
    for (int i = 0; i < l / 2; i++)
        counter[str[i] - 'a']++;
    for (int i = l / 2; i < l; i++)
        counter[str[i] - 'a']--;
    for (int i = 0; i < MAX; i++)
        if (counter[i] != 0)
            return true;
 
    return false;
}
 
// Driver function
int main()
{
    string str = "abcasdsabcae";
    if (function(str))
        cout << "Yes, both halves differ"
             <<" by at least one character";
    else
        cout << "No, both halves do"
             <<" not differ at all";
    return 0;
}


Java
// Java implementaion of the problem
import java.util.*;
import java.lang.*;
 
class GeeksforGeeks {
 
    final static int MAX = 26;
 
    // Function which break string into two halves
    // Increments frequency of characters for first half
    // Decrements frequency of characters for second half
    // true if any index has non-zero value
    static boolean function(String str)
    {
        int l = str.length();
 
        // Declaration and initialization
        // of counter array
        int counter[] = new int[MAX];
        for (int i = 0; i < MAX; i++)
            counter[i] = 0;
        for (int i = 0; i < l / 2; i++)
            counter[str.charAt(i) - 'a']++;
        for (int i = l / 2; i < l; i++)
            counter[str.charAt(i) - 'a']--;
        for (int i = 0; i < MAX; i++)
            if (counter[i] != 0)
                return true;
         
        return false;
    }
 
    // Driver function
    public static void main(String args[])
    {
        String str = "abcasdsabcae";
        if (function(str))
            System.out.print("Yes, both halves"
            +" differ by at least one character");
        else
            System.out.print("No, both halves"
            +" do not differ at all");
    }
}


Python3
# Python3 implementation to check if
# both halves of the string have
# at least one different character
MAX = 26
 
# Function which break string into two
# halves Increments frequency of characters
# for first half Decrements frequency of
# characters for second half true if any
# index has non-zero value
def function(st):
    global MAX
    l = len(st)
     
    # Declaration and initialization
    # of counter array
    counter = [0] * MAX
     
    for i in range(l // 2):
        counter[ord(st[i]) - ord('a')] += 1
         
    for i in range(l // 2, l):
        counter[ord(st[i]) - ord('a')] -= 1
         
    for i in range(MAX):
        if (counter[i] != 0):
            return True
             
    return False
 
# Driver function
st = "abcasdsabcae"
if function(st):
    print("Yes, both halves differ by at ",
          "least one character")
else:
    print("No, both halves do not differ at all")
 
# This code is contributed by Ansu Kumari


C#
// C# implementaion of the problem
using System;
 
class GFG {
 
    static int MAX = 26;
 
    // Function which break string into
    // two halves Increments frequency
    // of characters for first half
    // Decrements frequency of characters
    // for second half true if any index
    // has non-zero value
    static bool function(String str)
    {
        int l = str.Length;
 
        // Declaration and initialization
        // of counter array
        int []counter = new int[MAX];
        for (int i = 0; i < MAX; i++)
            counter[i] = 0;
        for (int i = 0; i < l / 2; i++)
            counter[str[i] - 'a']++;
        for (int i = l / 2; i < l; i++)
            counter[str[i] - 'a']--;
        for (int i = 0; i < MAX; i++)
            if (counter[i] != 0)
                return true;
         
        return false;
    }
 
    // Driver function
    public static void Main()
    {
        string str = "abcasdsabcae";
        if (function(str))
        Console.Write("Yes, both halves"
            + " differ by at least one "
                         + "character");
        else
            Console.Write("No, both halves"
              + " do not differ at all");
    }
}
 
// This code is contributed by anuj_67.


C++
// C++ implementation to check if
// both halves of the string have
// at least one different character
#include 
#include 
#include 
#include 
using namespace std;
 
// Function which break string into two halves
// Sorts the two halves separately
// Compares the two halves
// return true if any index has non-zero value
bool function(char str[])
{
    int l = strlen(str);
 
    // Declaration and initialization
    // of counter array
    sort(str, str + (l / 2));
    sort(str + (l / 2), str + l);
    for (int i = 0; i < l / 2; i++)
        if (str[i] != str[l / 2 + i])
            return true;
    return false;
}
 
// Driver function
int main()
{
    char str[] = "abcasdsabcae";
    if (function(str))
        cout << "Yes, both halves differ by"
             <<" at least one character";
    else
        cout << "No, both halves do"
             <<" not differ at all";
    return 0;
}


Java
// Java implementation to check if
// both halves of the string have
// at least one different character
 
import java.io.*;
import java.util.*;
 
class GFG {
 
// Function which break string into two halves
// Sorts the two halves separately
// Compares the two halves
// return true if any index has non-zero value
static Boolean function(char str[])
{
    int l = str.length;
 
    // Declaration and initialization
    // of counter array
    Arrays.sort(str, 0, (l / 2));
    Arrays.sort(str,(l / 2), l);
    for (int i = 0; i < l / 2; i++)
        if (str[i] != str[l / 2 + i])
            return true;
    return false;
}
 
    public static void main (String[] args) {
    char str[] = ("abcasdsabcae").toCharArray();
    if (function(str))
        System.out.println("Yes, both halves differ"
        + " by at least one character");
    else
        System.out.println("No, both halves do"
        + " not differ at all");
    }
}
 
// This code is contributed by Gitanjali.


Python3
# Python implementation to check if
# both halves of the string have
# at least one different character
 
# Function which break string into two halves
# Sorts the two halves separately
# Compares the two halves
# return true if any index has non-zero value
def function(st):
    st = list(st)
    l = len(st)
 
    # Declaration and initialization
    # of counter array
    st[:l//2] = sorted(st[:l//2])
    st[l//2:] = sorted(st[l//2:])
    for i in range(l//2):
        if (st[i] != st[l//2 + i]):
            return True
    return False
 
# Driver function
st = "abcasdsabcae"
if function(st): print("Yes, both halves differ ",
                       "by at least one character")
else: print("No, both halves do not differ at all")
 
# This code is contributed by Ansu Kumari


C#
// C# implementation to check if
// both halves of the string have
// at least one different character
using System;
     
class GFG
{
 
// Function which break string into two halves
// Sorts the two halves separately
// Compares the two halves
// return true if any index has non-zero value
static Boolean function(char []str)
{
    int l = str.Length;
 
    // Declaration and initialization
    // of counter array
    Array.Sort(str, 0, (l / 2));
    Array.Sort(str,(l / 2), l-(l/2));
    for (int i = 0; i < l / 2; i++)
        if (str[i] != str[l / 2 + i])
            return true;
    return false;
}
 
// Driver code
public static void Main (String[] args)
{
    char []str = ("abcasdsabcae").ToCharArray();
    if (function(str))
        Console.WriteLine("Yes, both halves differ"
        + " by at least one character");
    else
        Console.WriteLine("No, both halves do"
        + " not differ at all");
}
}
 
// This code contributed by Rajput-Ji


输出:

Yes, both halves differ by at least one character

方法2 :(一个计数器数组)

  • 此方法仅使用长度为26的单个数组。
  • 对于前半部分,我们增加长度为26的计数器数组中的字符。
  • 对于第二个数组,我们减少同一计数器数组中的字符。
  • 现在,如果对于与某个字符相对应的索引具有非零值,则表示存在的唯一字符
  • 正数是上半部分中的字符,负数是下半部分中的字符

C++

// C++ implementation to check if
// both halves of the string have
// at least one different character
#include 
#include 
#include 
using namespace std;
# define MAX 26
 
// Function which break string into two halves
// Increments frequency of characters for first half
// Decrements frequency of characters for second half
// true if any index has non-zero value
bool function(string str)
{
    int l = str.length();
     
    // Declaration and initialization
    // of counter array
    int counter[MAX];
    memset(counter, 0, sizeof(counter));
    for (int i = 0; i < l / 2; i++)
        counter[str[i] - 'a']++;
    for (int i = l / 2; i < l; i++)
        counter[str[i] - 'a']--;
    for (int i = 0; i < MAX; i++)
        if (counter[i] != 0)
            return true;
 
    return false;
}
 
// Driver function
int main()
{
    string str = "abcasdsabcae";
    if (function(str))
        cout << "Yes, both halves differ"
             <<" by at least one character";
    else
        cout << "No, both halves do"
             <<" not differ at all";
    return 0;
}

Java

// Java implementaion of the problem
import java.util.*;
import java.lang.*;
 
class GeeksforGeeks {
 
    final static int MAX = 26;
 
    // Function which break string into two halves
    // Increments frequency of characters for first half
    // Decrements frequency of characters for second half
    // true if any index has non-zero value
    static boolean function(String str)
    {
        int l = str.length();
 
        // Declaration and initialization
        // of counter array
        int counter[] = new int[MAX];
        for (int i = 0; i < MAX; i++)
            counter[i] = 0;
        for (int i = 0; i < l / 2; i++)
            counter[str.charAt(i) - 'a']++;
        for (int i = l / 2; i < l; i++)
            counter[str.charAt(i) - 'a']--;
        for (int i = 0; i < MAX; i++)
            if (counter[i] != 0)
                return true;
         
        return false;
    }
 
    // Driver function
    public static void main(String args[])
    {
        String str = "abcasdsabcae";
        if (function(str))
            System.out.print("Yes, both halves"
            +" differ by at least one character");
        else
            System.out.print("No, both halves"
            +" do not differ at all");
    }
}

Python3

# Python3 implementation to check if
# both halves of the string have
# at least one different character
MAX = 26
 
# Function which break string into two
# halves Increments frequency of characters
# for first half Decrements frequency of
# characters for second half true if any
# index has non-zero value
def function(st):
    global MAX
    l = len(st)
     
    # Declaration and initialization
    # of counter array
    counter = [0] * MAX
     
    for i in range(l // 2):
        counter[ord(st[i]) - ord('a')] += 1
         
    for i in range(l // 2, l):
        counter[ord(st[i]) - ord('a')] -= 1
         
    for i in range(MAX):
        if (counter[i] != 0):
            return True
             
    return False
 
# Driver function
st = "abcasdsabcae"
if function(st):
    print("Yes, both halves differ by at ",
          "least one character")
else:
    print("No, both halves do not differ at all")
 
# This code is contributed by Ansu Kumari

C#

// C# implementaion of the problem
using System;
 
class GFG {
 
    static int MAX = 26;
 
    // Function which break string into
    // two halves Increments frequency
    // of characters for first half
    // Decrements frequency of characters
    // for second half true if any index
    // has non-zero value
    static bool function(String str)
    {
        int l = str.Length;
 
        // Declaration and initialization
        // of counter array
        int []counter = new int[MAX];
        for (int i = 0; i < MAX; i++)
            counter[i] = 0;
        for (int i = 0; i < l / 2; i++)
            counter[str[i] - 'a']++;
        for (int i = l / 2; i < l; i++)
            counter[str[i] - 'a']--;
        for (int i = 0; i < MAX; i++)
            if (counter[i] != 0)
                return true;
         
        return false;
    }
 
    // Driver function
    public static void Main()
    {
        string str = "abcasdsabcae";
        if (function(str))
        Console.Write("Yes, both halves"
            + " differ by at least one "
                         + "character");
        else
            Console.Write("No, both halves"
              + " do not differ at all");
    }
}
 
// This code is contributed by anuj_67.

两种方法的时间复杂度都是线性的,即O(len)
方法3:(没有多余的空间)

  • 以字符数组形式输入字符串
  • 分别对两个字符串排序
  • 一起遍历这两个半部分,如果它们在任何时候都不同,则返回true
    到调用函数

请遵循以下代码。

C++

// C++ implementation to check if
// both halves of the string have
// at least one different character
#include 
#include 
#include 
#include 
using namespace std;
 
// Function which break string into two halves
// Sorts the two halves separately
// Compares the two halves
// return true if any index has non-zero value
bool function(char str[])
{
    int l = strlen(str);
 
    // Declaration and initialization
    // of counter array
    sort(str, str + (l / 2));
    sort(str + (l / 2), str + l);
    for (int i = 0; i < l / 2; i++)
        if (str[i] != str[l / 2 + i])
            return true;
    return false;
}
 
// Driver function
int main()
{
    char str[] = "abcasdsabcae";
    if (function(str))
        cout << "Yes, both halves differ by"
             <<" at least one character";
    else
        cout << "No, both halves do"
             <<" not differ at all";
    return 0;
}

Java

// Java implementation to check if
// both halves of the string have
// at least one different character
 
import java.io.*;
import java.util.*;
 
class GFG {
 
// Function which break string into two halves
// Sorts the two halves separately
// Compares the two halves
// return true if any index has non-zero value
static Boolean function(char str[])
{
    int l = str.length;
 
    // Declaration and initialization
    // of counter array
    Arrays.sort(str, 0, (l / 2));
    Arrays.sort(str,(l / 2), l);
    for (int i = 0; i < l / 2; i++)
        if (str[i] != str[l / 2 + i])
            return true;
    return false;
}
 
    public static void main (String[] args) {
    char str[] = ("abcasdsabcae").toCharArray();
    if (function(str))
        System.out.println("Yes, both halves differ"
        + " by at least one character");
    else
        System.out.println("No, both halves do"
        + " not differ at all");
    }
}
 
// This code is contributed by Gitanjali.

Python3

# Python implementation to check if
# both halves of the string have
# at least one different character
 
# Function which break string into two halves
# Sorts the two halves separately
# Compares the two halves
# return true if any index has non-zero value
def function(st):
    st = list(st)
    l = len(st)
 
    # Declaration and initialization
    # of counter array
    st[:l//2] = sorted(st[:l//2])
    st[l//2:] = sorted(st[l//2:])
    for i in range(l//2):
        if (st[i] != st[l//2 + i]):
            return True
    return False
 
# Driver function
st = "abcasdsabcae"
if function(st): print("Yes, both halves differ ",
                       "by at least one character")
else: print("No, both halves do not differ at all")
 
# This code is contributed by Ansu Kumari

C#

// C# implementation to check if
// both halves of the string have
// at least one different character
using System;
     
class GFG
{
 
// Function which break string into two halves
// Sorts the two halves separately
// Compares the two halves
// return true if any index has non-zero value
static Boolean function(char []str)
{
    int l = str.Length;
 
    // Declaration and initialization
    // of counter array
    Array.Sort(str, 0, (l / 2));
    Array.Sort(str,(l / 2), l-(l/2));
    for (int i = 0; i < l / 2; i++)
        if (str[i] != str[l / 2 + i])
            return true;
    return false;
}
 
// Driver code
public static void Main (String[] args)
{
    char []str = ("abcasdsabcae").ToCharArray();
    if (function(str))
        Console.WriteLine("Yes, both halves differ"
        + " by at least one character");
    else
        Console.WriteLine("No, both halves do"
        + " not differ at all");
}
}
 
// This code contributed by Rajput-Ji

输出:

Yes, both halves differ by at least one character

上述方法的复杂度为O(len log(len))