如何检查字符串#2中的所有单词是否存在于字符串#1中?它应该不区分大小写,我希望在比较单词时排除所有标点符号和特殊字符。
任何帮助?
感谢。
答案 0 :(得分:7)
运行时间:O(n)
我会让别人用Java实现这个。
答案 1 :(得分:0)
要在字符串中查找单词而忽略各种标点符号等,可以使用StringTokenizer类。
StringTokenizer st = new StringTokenizer("Your sentence;with whatever. punctuations? might exists", " :?.,-+=[]");
使用第二个示例中提供的分隔符将String分解为令牌。然后,您可以使用hasMoreTokens()和nextToken()方法迭代标记。
然后你可以使用@MattDiPasquale建议的算法。
答案 2 :(得分:0)
您可以尝试String的内置split method
看起来像
public String[] split(String regex)
并根据您使用的正则表达式返回一个Strings数组。上面的链接中有一些例子。
您可以通过这种方式轻松生成两个数组(一个用于String#1,另一个用于String#2)。
对数组进行排序,然后检查数组是否相等。 (规模和顺序)
如果您使用java.util.Arrays
,则可以简化数组排序Java中的数组有很多库方法,您应该了解它们,因为它们有时非常有用: http://leepoint.net/notes-java/data/arrays/arrays-library.html
这比使用您选择的分隔符构建字典/散列表/ ADT效率稍差(如在MattDiPasquale的答案中),但如果您不熟悉散列函数或字典(作为数据类型),则可能更容易理解)。
答案 3 :(得分:0)
isContainsAll(s1, s2)
1。用“”分割s2; s.split(“”)
2。检查s1是否包含s2的所有元素
public static boolean isContainsAll(String s1, String s2){
String[] split = s2.split(" ");
for(int i=0; i<split.length; i++){
if(!s1.contains(split[i])){
return false;
}
}
return true;
}
public static void main(String... args){
System.out.println(isContainsAll("asd dsasda das asd; asds asd;/ ", "asd;/"));
}
答案 4 :(得分:0)
虽然执行此操作的算法很简单,但如果要支持多个区域设置,则实现更复杂。下面是支持多个区域设置的示例代码。我用英文和中文证实了这一点(但我不确定它是否通过土耳其测试;-))。无论如何,下面的代码需要一些重构,但这会让你开始。
注意:即使您不希望支持除英语之外的其他语言,我仍然会使用下面的单词boundarie / punctuations / grammar等依赖于语言环境/语言,StringTokenizer,String可能无法很好地解决这个问题。拆分(...)和其他基本API。
import java.text.BreakIterator;
import java.text.Collator;
import java.util.Locale;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.lang.StringEscapeUtils;
public class UnicodeWordCount
{
public static void main(final String[] args)
{
testEnglish();
testChinese();
}
public static void testEnglish()
{
BreakIterator wordIterator = BreakIterator.getWordInstance(Locale.ENGLISH);
String str = "This is the source string";
String match = "source string is this";
String doesntMatch = "from Pangea";
Set<String> uniqueWords = extractWords(str, wordIterator, Locale.ENGLISH);
printWords(uniqueWords);
System.out.println("Should print true: " + contains(match, wordIterator, uniqueWords));
System.out.println("Should print false: " + contains(doesntMatch, wordIterator, uniqueWords));
}
public static void testChinese()
{
BreakIterator wordIterator = BreakIterator.getWordInstance(Locale.CHINESE);
String str = "\u4E0D\u70BA\u6307\u800C\u8B02\u4E4B\u6307\uFF0C\u662F[\u7121\u90E8]\u70BA\u6307\u3002\u201D\u5176\u539F\u6587\u70BA";
String match = "\u5176\u539F\u6587\u70BA\uFF0C\u70BA\u6307";
String doesntMatch = "\u4E0D\u70BA\u6307\u800C\u8B02\u4E4B\u6307\uFF0C\u662F[\u517C\u4E0D]\u70BA\u6307\u3002";
Set<String> uniqueWords = extractWords(str, wordIterator, Locale.CHINESE);
printWords(uniqueWords);
System.out.println("Should print true: " + contains(match, wordIterator, uniqueWords));
System.out.println("Should print false: " + contains(doesntMatch, wordIterator, uniqueWords));
}
public static Set<String> extractWords(final String input, final BreakIterator wordIterator, final Locale desiredLocale)
{
Collator collator = Collator.getInstance(desiredLocale);
collator.setStrength(Collator.PRIMARY);
Set<String> uniqueWords = new TreeSet<String>(collator);
wordIterator.setText(input);
int start = wordIterator.first();
int end = wordIterator.next();
while (end != BreakIterator.DONE)
{
String word = input.substring(start, end);
if (Character.isLetterOrDigit(word.charAt(0)))
{
uniqueWords.add(word);
}
start = end;
end = wordIterator.next();
}
return uniqueWords;
}
public static boolean contains(final String target, final BreakIterator wordIterator, final Set<String> uniqueWords)
{
wordIterator.setText(target);
int start = wordIterator.first();
int end = wordIterator.next();
while (end != BreakIterator.DONE)
{
String word = target.substring(start, end);
if (Character.isLetterOrDigit(word.charAt(0)))
{
if (!uniqueWords.contains(word))
{
return false;
}
}
start = end;
end = wordIterator.next();
}
return true;
}
private static void printWords(final Set<String> uniqueWords)
{
for (String word : uniqueWords)
{
System.out.println(StringEscapeUtils.escapeJava(word));
}
}
}