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