实现节省空间的算法,以检查字符串的第一个重复字符,而无需在一次遍历中使用任何其他数据结构。不允许使用其他数据结构,例如count数组,hash等。
例子 :
Input : abcfdeacf
Output : char = a, index= 6
想法是使用整数变量,并使用其二进制表示形式的位来存储是否存在字符。通常,一个整数至少有32位,我们只需要存储26个字符的存在/不存在。
C++
// Efficiently check First repeated character
// in C++ program
#include
using namespace std;
// Returns -1 if all characters of str are
// unique.
// Assumptions : (1) str contains only characters
// from 'a' to 'z'
// (2) integers are stored using 32
// bits
int FirstRepeated(string str)
{
// An integer to store presence/absence
// of 26 characters using its 32 bits.
int checker = 0;
for (int i = 0; i < str.length(); ++i)
{
int val = (str[i]-'a');
// If bit corresponding to current
// character is already set
if ((checker & (1 << val)) > 0)
return i;
// set bit in checker
checker |= (1 << val);
}
return -1;
}
// Driver code
int main()
{
string s = "abcfdeacf";
int i=FirstRepeated(s);
if (i!=-1)
cout <<"Char = "<< s[i] << " and Index = "<
Java
// Efficiently check First repeated character
// in Java program
public class First_Repeated_char {
static int FirstRepeated(String str)
{
// An integer to store presence/absence
// of 26 characters using its 32 bits.
int checker = 0;
for (int i = 0; i < str.length(); ++i)
{
int val = (str.charAt(i)-'a');
// If bit corresponding to current
// character is already set
if ((checker & (1 << val)) > 0)
return i;
// set bit in checker
checker |= (1 << val);
}
return -1;
}
// Driver code
public static void main(String args[])
{
String s = "abcfdeacf";
int i=FirstRepeated(s);
if (i!=-1)
System.out.println("Char = "+ s.charAt(i) + " and Index = "+i);
else
System.out.println( "No repeated Char");
}
}
// This code is contributed by Sumit Ghosh
Python
# Efficiently check First repeated character
# in Python
# Returns -1 if all characters of str are
# unique.
# Assumptions : (1) str contains only characters
# from 'a' to 'z'
## (2) integers are stored using 32
## bits
def FirstRepeated(string):
# An integer to store presence/absence
# of 26 characters using its 32 bits.
checker = 0
pos = 0
for i in string:
val = ord(i) - ord('a');
# If bit corresponding to current
# character is already set
if ((checker & (1 << val)) > 0):
return pos
# set bit in checker
checker |= (1 << val)
pos += 1
return -1
# Driver code
string = "abcfdeacf"
i = FirstRepeated(string)
if i != -1:
print "Char = ", string[i], " and Index = ", i;
else:
print "No repeated Char"
# This code is contributed by Sachin Bisht
C#
// C# program to Efficiently
// check First repeated character
using System;
public class First_Repeated_char {
static int FirstRepeated(string str)
{
// An integer to store presence/absence
// of 26 characters using its 32 bits.
int checker = 0;
for (int i = 0; i < str.Length; ++i)
{
int val = (str[i]-'a');
// If bit corresponding to current
// character is already set
if ((checker & (1 << val)) > 0)
return i;
// set bit in checker
checker |= (1 << val);
}
return -1;
}
// Driver code
public static void Main()
{
string s = "abcfdeacf";
int i=FirstRepeated(s);
if (i!=-1)
Console.WriteLine("Char = " + s[i] +
" and Index = " + i);
else
Console.WriteLine( "No repeated Char");
}
}
// This code is contributed by vt_m.
PHP
0)
return $i;
// set bit in checker
$checker |= (1 << $val);
}
return -1;
}
// Driver code
$s = "abcfdeacf";
$i=FirstRepeated($s);
if ($i!=-1)
echo "Char = " . $s[$i] .
" and Index = " . $i;
else
echo "No repeated Char";
// This code is contributed by ita_c
?>
输出:
Char = a and Index = 6
时间复杂度: O(n)
辅助空间: O(1)