如何确定一个字符串部分包含另一个字符串?(首选Java)

如何确定一个字符串部分包含另一个字符串?(首选Java),java,string,matching,Java,String,Matching,我正在做一个java项目,需要根据以下逻辑确定一个字符串是否包含另一个字符串: 父字符串“thisaparentstring”contais“isstr”应返回true。因为“isstr”的所有字符都可以在保留子字符串顺序的父字符串中找到 contains应不区分大小写 有没有人可以帮助我如何写一个简单而有效的方式的逻辑,或任何图书馆也非常感谢 假设“这是一个父字符串”是您的父字符串。“isstr”是查询字符串 对于不区分大小写的匹配,请将父字符串和查询字符串都转换为小写 您可以将父字符串拆

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

  • 父字符串“thisaparentstring”contais“isstr”应返回true。因为“isstr”的所有字符都可以在保留子字符串顺序的父字符串中找到
  • contains应不区分大小写
有没有人可以帮助我如何写一个简单而有效的方式的逻辑,或任何图书馆也非常感谢

假设“这是一个父字符串”是您的父字符串。“isstr”是查询字符串

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

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

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

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

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

可以这样简单:

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;
}
public boolean contains(最终字符串基,最终字符串搜索){
最终字符串baseLowerCase=base.toLowerCase(Locale.ENGLISH);
for(最后一个字符c:search.toLowerCase(Locale.ENGLISH.tocharray())
if(baseLowerCase.indexOf(c)<0)
返回false;
返回true;
}
例如:
contains(“这是一个父字符串”,“isstr”)返回
true

在这里,您要做的就是将您在中搜索的
字符串
转换为一个
char[]
,在其中您将被迭代。然后,您要检查基本
字符串是否包含
char
(使用
String#indexOf(char)
)。您希望在第一次出现时返回
false
,因为它不包含
char
(意思是
String\indexOf(char)
返回值<0)

公共静态void main(String[]args){
String parentStr=“这是一个父字符串”,childStr=“iSStr”;
//将两者都转到lowcase。
parentStr.toLowerCase();childStr.toLowerCase();
整数childStrIndex=0;
//运行父字符串,如果找到匹配项,则继续与下一个进行比较
//子字符串中的字符。
对于(int index=0;index

希望这有帮助。顺便说一句,这听起来像是家庭作业。

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

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


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

您是否尝试为此编写一些代码?是否可以共享这些代码?尝试查看一下,使其不区分大小写,通过string.toUppercase()或string.toLowercase()将两个字符串转换为相同的大小写到目前为止,我知道的一种方法是使用pattern.compile().Insert“*”编译正则表达式模式进入子字符串的开头、中间和结尾。并使用不区分大小写的方式进行编译。但我觉得这有点乏味,可能效率不高。我希望有更好的方法来实现这一点……将其转换为正则表达式匹配的最直接的方法将面临灾难性回溯的巨大风险,但返回
false
如果您使用
iSStr
而不是
iSStr
,是否不区分大小写?它也不尊重op希望的搜索顺序。请参阅@astinx Good catch,谢谢。非常感谢!这与我最初的想法相同。我还认为它非常昂贵。非常感谢!这种方法看起来效率更高than regex mathing。顺便说一句,这不是家庭作业。:p非常感谢!它的工作方式与@astinx answer类似,但在堆栈中控制子字符串索引,而不是整数索引++。我不确定哪一个工作得更快,但这一个看起来更详细。正如我所说,这只是一个示例。您可以进一步改进代码,使其更有效顾客。
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;
}
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);
}