如何确定一个字符串PARTIALLY包含另一个字符串? (优选的Java)

时间:2013-10-07 02:51:14

标签: java string matching

我正在做一个java项目,需要确定一个字符串是否包含下面逻辑的另一个字符串:

  • 父字符串“This is a parent string”contais“isstr”应返回true。因为“isstr”的所有字符都可以在保存子字符串顺序的父字符串中找到。
  • contains应该不区分大小写。

有没有人可以帮助我如何以简单有效的方式编写逻辑,或者任何图书馆也非常感谢!

4 个答案:

答案 0 :(得分:1)

让我们说“这是一个父字符串”是你的父字符串。和“isstr”是查询字符串。

对于不区分大小写的匹配,请将父字符串和查询字符串转换为小写。

您可以将父字符串拆分为关键字,并在查询字符串中查找每个关键字。

反转查询字符串(“isstr”)并将其推送到堆栈,因为您希望保留订单。

Stack<Character> stack = new Stack<Character>();
String reversedQueryString = new StringBuilder(queryString).reverse().toString();
for (char ch: reversedQueryString.toCharArray()) {
    stack.push(ch);
}

当它们与父字符串中的字母匹配时,从查询字符串中弹出字母。在这种情况下,堆栈非常有用,因为我们不关心是否再次找到相同的字符。

String[] keywords = parentString.split(" "); \\ to split on spaces.
for(String keyword : keywords){
    processKeyword(keyword);
}

void processKeyword(String keyword){
    for (char c: keyword.toCharArray()) {
        if(stack.top().equals(c)){
            stackCheck();
        }  
    } 
}

void stackCheck(){
    if(!stack.isEmpty())
       stack.pop();
    else{
       System.out.println("Eureka");

    }
}

这只是一个例子,您的实施可能会有所不同。例如,您可能希望检查关键字中的两个字符,以使其部分包含查询字符串。

答案 1 :(得分:1)

可能就是这么简单:

public boolean contains(final String base, final String search){
    final String baseLowerCase = base.toLowerCase(Locale.ENGLISH);
    for(final char c : search.toLowerCase(Locale.ENGLISH).toCharArray())
        if(baseLowerCase.indexOf(c) < 0)
            return false;
    return true;
}

例如:contains("This is a parent string", "isstr");返回true

您在这里尝试做的是将您要搜索的String转换为您将在其中进行迭代的char[]。然后,您要查看基本String是否包含char(使用String#indexOf(char))。您希望在第一次出现时返回false,但不包含char(意味着String#indexOf(char)返回值<0)

答案 2 :(得分:0)

public static void main(String[] args) {
    String parentStr = "This is a parent string", childStr = "iSStr";
    //Turn both to lowcase.
    parentStr.toLowerCase(); childStr.toLowerCase();
    Integer childStrIndex = 0;
    //Run over the parent string and if you found a match then keep comparing with the next
    //character in the child string.
    for (int index = 0 ; index < parentStr.length(); index++) {
        Character currChar = parentStr.charAt(index);
        if (childStr.length() <= childStrIndex)
            break;
        if (currChar.equals(childStr.charAt(childStrIndex)))
            childStrIndex++;
    }
    // If at the end you are in the last character of the child string, then is true.
    if (childStrIndex >= childStr.length())
        System.out.print(true);
    else
        System.out.print(false);
}

希望这会有所帮助。 BTW这听起来像是家庭作业。

答案 3 :(得分:0)

搜索将涉及回溯,因此如果您要手动实现,则可能需要递归解决方案。

但一个简单的方法是将输入字符串预处理为正则表达式,然后执行正则表达式“查找”。例如,如果搜索字符串是“instr”,则正则表达式可以是"[iI].*[nN].*[sS].*[tT].*[rR]"

请注意,这种搜索不可避免地会变得昂贵,如果使用正则表达式进行搜索则更是如此。实际上,一个简单的实现是O(M^N),其中M是输入字符串的长度,N是搜索字符串的长度。