我是Java的新手,我目前正在研究一个隐藏的Word"能够从用户获取输入的程序,2个字符串,并查看第2个字符串是否包含在第1个字符串中。我一直处理的棘手部分是第一个字符串中的单词不必与第二个字符串的顺序相同。
例如,单词" tot"可以在#34;番茄"这个词中找到即使它没有按照确切的顺序出现。
我发现我可以对字符串中的字符进行排序以测试它们是否匹配,但每当我尝试使用测试数据时,它总是打印出无法从第一个字符串中找到该单词。
如果有人能给我一些关于我错过的东西的提示,我真的很感激。我真的不明白为什么它总是打印出来。
另外请注意,如果您想使用不同长度的字符串,我会在某处读到有关BitSet util是比字符数组更好的选项,但我不确定它是真的还是如果它甚至对字符进行排序。
public static void main(String[] args)
{
input = new Scanner(System.in);
System.out.println("Please enter a word"); //prompts user for a word
String word = input.next();
System.out.println("Please enter a word you would like to search"); //prompts user again to enter a word that they would like to search for within the first word
String search = input.next();
if (usedChar(word).equals(usedChar(search))) //method call using the two input variables
{ //the if statement checks to see if the two Strings are equal
System.out.print("The word " + search + " is found in the word " + word);
}
else
{
System.out.print("The word was not found in " + word); //returns second print statement if the Strings do not match
}
}
public static BitSet usedChar(String s){//method to iterate through Strings
BitSet bs = new BitSet();
for (int i = 0; i < s.length(); i++) {
bs.set(s.charAt(i));
}
return bs;
}
答案 0 :(得分:0)
您当前的方法不起作用,因为您正在检查代表您的输入字符串的两个BitSet是否相等,除非两个字符串具有完全相同的字母,否则它们将不会。我不认为排序字符串中的字母也可以。你不会找到序列&#34; abc&#34;顺序&#34; aabbcc&#34;即使两个字符串都已排序。
更好的方法可能是从每个字符串创建一个HashMap,每个字母作为键,以及它作为值出现的次数。然后检查第一个单词以确保每个字母有足够的出现以隐藏第二个单词。
答案 1 :(得分:0)
性能可以改进,但你可以尝试下面的代码;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please enter a word"); // prompts user for a word
String word = input.next();
char[] charOfWrds = word.toCharArray();
System.out.println("Please enter a word you would like to search");
String search = input.next();
char[] charOfSrch = search.toCharArray();
if (isContains(charOfWrds, charOfSrch)) // method call using the
// two input variables
{ // the if statement checks to see if the two Strings are equal
System.out.print("The word " + search + " is found in the word "
+ word);
} else {
System.out.print("The word was not found in " + word);
}
}
public static Boolean isContains(char[] charOfWrds, char[] charOfSrch) {
int count = 0;
for (char cha : charOfSrch) {
for (char chaaa : charOfSrch) {
if (cha == chaaa)
count++;
}
}
if (count == charOfSrch.length)
return true;
return false;
}
答案 2 :(得分:0)
最佳解决方案是维护一个int数组,该数组存储主字符串中每个字符的计数。然后检查测试字符串中的每个字符是否countArr中存在count.If计数approches 0突破循环。此解决方案将复杂性优化为O(n)
,而不是使用带有O(n ^ 2)的嵌套for循环。
方法countChar
计算主字符串中每个字符的出现次数,方法checkChar
检查测试字符串中的每个字符是否有足够的出现次数。
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please enter a word"); // prompts user for a word
String word = input.next();
int arr[] = countChar(word);
System.out.println("Please enter a word you would like to search");
String search = input.next();
if(checkChar(search, arr)==true){
System.out.println("Word Found!!");
}else{
System.out.println("Word cannot be found!!");
}
}
public static int[] countChar(String s) {
int[] countArr = new int[256];
for (int i = 0; i < s.length(); i++) {
countArr[s.charAt(i)] = countArr[s.charAt(i)] + 1;
}
return countArr;
}
public static boolean checkChar(String s, int[] countArr) {
for (int i = 0; i < s.length(); i++) {
if (countArr[s.charAt(i)] == 0) {
return false;
} else {
countArr[s.charAt(i)] = countArr[s.charAt(i)] - 1;
}
}
return true;
}
}