Java 字符串中的重复字母检查
Java repeated letter check in string
我在弄清楚如何检查用户输入的重复字母时遇到了问题。程序需要输出重复的字母为真,如果没有则为假。程序不应计算重复的数字或符号。
例如:
用户输入:巧克力
程序输出:True
用户输入:112 cream
程序输出:False
试试这个:
String username ;
char[] x = username.toCharArray();
boolean duplicates=false;
for (j=0;j<x.length;j++)
for (k=j+1;k<x.length;k++)
if (x[k] == x[j])
duplicates=true
private static boolean check(String input) {
Set<Character> tmp = new HashSet<Character>();
for(char ch : input.toCharArray()) {
if (Character.isLetter(ch) && !tmp.add(ch)) {
return true;
}
}
return false;
}
这是另一个版本,基于 @rell 的回答,但没有 HashSet
或 char[]
创建。
private static boolean check(String input) {
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isLetter(ch) && input.indexOf(ch, i + 1) != -1) {
return true;
}
}
return false;
}
对于较小的输入字符串,这很可能因此会更快。但是对于更长的输入字符串,@rell 的版本可能更快,因为他使用 HashSet
和 O(1)
lookup/insert,并且由于循环是 O(n)
,因此总数是 O(n)
。我的解决方案是 O(n^2)
(循环 O(n)
乘以 indexOf
和 O(n)
),最坏情况下的输入是这样的 abcdefghijklmnopqrstuvwxyzz
.
更新另一个带流的版本。
private static boolean check(String input) {
IntStream characters = input.codePoints().filter(Character::isLetter);
return characters
.distinct()
.count() == characters.count();
}
更新 修复流版本中的错误
我们可以用这个减少到单循环。
boolean checkDuplicates(char[] x)
{
Set<char> xSet = new HashSet<char>();
for (char c : x)
{
if (xSet.contains(c)) return true;
xSet.add(i);
}
return false;
}
1.) 对字符数组进行排序。
2.) 遍历数组以查看是否第 i 个值 == (i+1)th value。如果找到,return 错误。否则,return 为真。
时间复杂度:O(nlogn)(用于排序)
Space 复杂度:O(1)
为了检查任何字母的重复次数是否超过限制次数,您可以使用以下方法:
public static boolean repeatedMoreThanLimitedLength(String str, int limitLength) {
Pattern pattern = Pattern.compile("(\w)\1+");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
if (matcher.group().length() >= limitLength)
return true;
}
return false;
}
我在弄清楚如何检查用户输入的重复字母时遇到了问题。程序需要输出重复的字母为真,如果没有则为假。程序不应计算重复的数字或符号。
例如:
用户输入:巧克力
程序输出:True用户输入:112 cream
程序输出:False
试试这个:
String username ;
char[] x = username.toCharArray();
boolean duplicates=false;
for (j=0;j<x.length;j++)
for (k=j+1;k<x.length;k++)
if (x[k] == x[j])
duplicates=true
private static boolean check(String input) {
Set<Character> tmp = new HashSet<Character>();
for(char ch : input.toCharArray()) {
if (Character.isLetter(ch) && !tmp.add(ch)) {
return true;
}
}
return false;
}
这是另一个版本,基于 @rell 的回答,但没有 HashSet
或 char[]
创建。
private static boolean check(String input) {
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isLetter(ch) && input.indexOf(ch, i + 1) != -1) {
return true;
}
}
return false;
}
对于较小的输入字符串,这很可能因此会更快。但是对于更长的输入字符串,@rell 的版本可能更快,因为他使用 HashSet
和 O(1)
lookup/insert,并且由于循环是 O(n)
,因此总数是 O(n)
。我的解决方案是 O(n^2)
(循环 O(n)
乘以 indexOf
和 O(n)
),最坏情况下的输入是这样的 abcdefghijklmnopqrstuvwxyzz
.
更新另一个带流的版本。
private static boolean check(String input) {
IntStream characters = input.codePoints().filter(Character::isLetter);
return characters
.distinct()
.count() == characters.count();
}
更新 修复流版本中的错误
我们可以用这个减少到单循环。
boolean checkDuplicates(char[] x)
{
Set<char> xSet = new HashSet<char>();
for (char c : x)
{
if (xSet.contains(c)) return true;
xSet.add(i);
}
return false;
}
1.) 对字符数组进行排序。
2.) 遍历数组以查看是否第 i 个值 == (i+1)th value。如果找到,return 错误。否则,return 为真。
时间复杂度:O(nlogn)(用于排序)
Space 复杂度:O(1)
为了检查任何字母的重复次数是否超过限制次数,您可以使用以下方法:
public static boolean repeatedMoreThanLimitedLength(String str, int limitLength) {
Pattern pattern = Pattern.compile("(\w)\1+");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
if (matcher.group().length() >= limitLength)
return true;
}
return false;
}