给定字符串str ,任务是按字典顺序查找给定字符串中存在的所有重复字符,而无需使用任何其他数据结构。
例子:
Input: str = “geeksforgeeks”
Output: e g k s
Explanation:
Frequency of character ‘g’ = 2
Frequency of character ‘e’ = 4
Frequency of character ‘k’ = 2
Frequency of character ‘s’ = 2
Therefore, the required output is e g k s.
Input: str = “apple”
Output: p
Explanation:
Frequency of character ‘p’ = 2.
Therefore, the required output is p.
方法:请按照以下步骤解决问题:
- 初始化一个变量,例如first ,在这里首先检查第i个字符(i +’a’)在字符串中是否存在至少一次。
- 初始化一个变量,表示第二,其中i第二检查的第i位,如果字符第(i +“A”)存在的字符串中的至少两倍或没有。
- 遍历字符串的字符。对于每一个我个字符,检查是否STR [1]已经发生了字符串或不在家。如果发现是真的,则将秒的第(str [i] –’a’)位设置为秒。
- 否则,组(STR [Ⅰ] – ‘A’)个第一的位。
- 最后,在[ 0,25 ]范围内进行迭代,并检查是否设置了第一和第二位的第i个位。如果发现为真,则打印(i +’a’) 。
下面是上述方法的实现:
C++
// C++ program to implement
// the above approach
#include
using namespace std;
// Function to find duplicate characters
// in string without using any additional
// data structure
void findDuplicate(string str, int N)
{
// Check if (i + 'a') is present
// in str at least once or not.
int first = 0;
// Check if (i + 'a') is present
// in str at least twice or not.
int second = 0;
// Iterate over the characters
// of the string str
for (int i = 0; i < N; i++) {
// If str[i] has already occurred in str
if (first & (1 << (str[i] - 'a'))) {
// Set (str[i] - 'a')-th bit of second
second
= second | (1 << (str[i] - 'a'));
}
else {
// Set (str[i] - 'a')-th bit of second
first
= first | (1 << (str[i] - 'a'));
}
}
// Iterate over the range [0, 25]
for (int i = 0; i < 26; i++) {
// If i-th bit of both first
// and second is Set
if ((first & (1 << i))
&& (second & (1 << i))) {
cout << char(i + 'a') << " ";
}
}
}
// Driver Code
int main()
{
string str = "geeksforgeeks";
int N = str.length();
findDuplicate(str, N);
}
Java
// Java program for the above approach
public class GFG
{
// Function to find duplicate characters
// in string without using any additional
// data structure
static void findDuplicate(String str, int N)
{
// Check if (i + 'a') is present
// in str at least once or not.
int first = 0;
// Check if (i + 'a') is present
// in str at least twice or not.
int second = 0;
// Iterate over the characters
// of the string str
for (int i = 0; i < N; i++)
{
// If str[i] has already occurred in str
if ((first & (1 << (str.charAt(i) - 'a'))) != 0)
{
// Set (str[i] - 'a')-th bit of second
second
= second | (1 << (str.charAt(i) - 'a'));
}
else
{
// Set (str[i] - 'a')-th bit of second
first
= first | (1 << (str.charAt(i) - 'a'));
}
}
// Iterate over the range [0, 25]
for (int i = 0; i < 26; i++)
{
// If i-th bit of both first
// and second is Set
if (((first & (1 << i))
& (second & (1 << i))) != 0) {
System.out.print((char)(i + 'a') + " ");
}
}
}
// Driver Code
static public void main(String args[])
{
String str = "geeksforgeeks";
int N = str.length();
findDuplicate(str, N);
}
}
// This code is contributed by AnkThon.
Python3
# Python 3 code added. program to implement
# the above approach
# Function to find duplicate characters
# in str1ing without using any additional
# data str1ucture
def findDuplicate(str1, N):
# Check if (i + 'a') is present
# in str1 at least once or not.
first = 0
# Check if (i + 'a') is present
# in str1 at least twice or not.
second = 0
# Iterate over the characters
# of the str1ing str1
for i in range(N):
# If str1[i] has already occurred in str1
if (first & (1 << (ord(str1[i]) - 97))):
# Set (str1[i] - 'a')-th bit of second
second = second | (1 << (ord(str1[i]) - 97))
else:
# Set (str1[i] - 'a')-th bit of second
first = first | (1 << (ord(str1[i]) - 97))
# Iterate over the range [0, 25]
for i in range(26):
# If i-th bit of both first
# and second is Set
if ((first & (1 << i)) and (second & (1 << i))):
print(chr(i + 97), end = " ")
# Driver Code
if __name__ == '__main__':
str1 = "geeksforgeeks"
N = len(str1)
findDuplicate(str1, N)
# This code is contributed by SURENDRA_GANGWAR.
C#
// C# program for the above approach
using System;
class GFG
{
// Function to find duplicate characters
// in string without using any additional
// data structure
static void findDuplicate(string str, int N)
{
// Check if (i + 'a') is present
// in str at least once or not.
int first = 0;
// Check if (i + 'a') is present
// in str at least twice or not.
int second = 0;
// Iterate over the characters
// of the string str
for (int i = 0; i < N; i++) {
// If str[i] has already occurred in str
if ((first & (1 << (str[i] - 'a'))) != 0)
{
// Set (str[i] - 'a')-th bit of second
second
= second | (1 << (str[i] - 'a'));
}
else
{
// Set (str[i] - 'a')-th bit of second
first
= first | (1 << (str[i] - 'a'));
}
}
// Iterate over the range [0, 25]
for (int i = 0; i < 26; i++)
{
// If i-th bit of both first
// and second is Set
if (((first & (1 << i))
& (second & (1 << i))) != 0) {
Console.Write((char)(i + 'a') + " ");
}
}
}
// Driver Code
static public void Main()
{
string str = "geeksforgeeks";
int N = str.Length;
findDuplicate(str, N);
}
}
// This code is contributed by susmitakundugoaldanga.
输出:
e g k s
时间复杂度: O(N)
辅助空间: O(1)