如何查看字符串是不是为子字符串。 Java [重复]

Posted

技术标签:

【中文标题】如何查看字符串是不是为子字符串。 Java [重复]【英文标题】:How to see if a string is a substring. Java [duplicate]如何查看字符串是否为子字符串。 Java [重复] 【发布时间】:2016-02-07 00:36:59 【问题描述】:

我无法确定较小的字符串是否是较大字符串的子字符串。 例子: s1 = 船 s2 = 汽船 这是我的代码。我只能使用 for 循环和 charAt。

public static boolean isSubstring(String s1, String s2)
    boolean substringcheck = false;
    int correct = 0;
    for(int i=0; i<s1.length(); i++)
        for(int j=0; j<s2.length(); j++)
            if(s1.charAt(i) == s2.charAt(j))      
                correct++;
                for(int n=0; n<s1.length(); n++)
                    if(s1.charAt(n) == s2.charAt(j))
                        correct++;
                    else
                        correct = 0;
                    
                
            
        
    
    if(correct == s1.length())
        substringcheck = true;
    else
        substringcheck = false;
    
    return substringcheck;


我很困惑在 if 语句之后放置什么来检查较小字符串中的所有字符是否与我们在较大字符串中找到匹配项后的字符匹配。

【问题讨论】:

我投票决定将此问题作为题外话结束,因为这是一项需要付出一点努力的家庭作业 提示:您(可能)将s2 的所有字符与s1[i] 进行比较。这不对……是吗。 if 中需要另一个 for 循环,一个标志变量来确定是否找到了子字符串,或者您可以使用 aa break 语句,然后您需要在两个 for 循环中处理结束条件跨度> 好吧,我认为这是因为我正在检查 s1 是否在 s2 中 大家好 - 这是一个简单的编程错误。我正试图让 OP 在他自己的脑海中弄清楚...... 【参考方案1】:

让我们来看看吧

s1 = boat
s2 = steamboat
i = 0
j = 0

//walking through the code:

if(b == s) // nope, increment j (j now equals 1), begin next loop iteration

if(b == t) // nope, repeat

if(b == e) // nope, repeat until...

if(b == b) // oh, this looks good! what do we need to do now?

if(b == o) //j got incremented again, doh!

【讨论】:

好的,我知道一旦找到匹配项,我需要停止 for 循环。但如何?我们甚至还没有在课堂上学到这一点。 我的猜测是在我的 if 语句中放另一个 for 循环,看看其余的是否等于 s1 你在正确的轨道上。如果你先在纸上解决它会有所帮助。然后弄清楚代码的外观。在较大的字符串中找到字母“b”(较小字符串中的第一个字母),如果根本找不到,那很好,它不是子字符串。如果确实找到了,请查看两个字符串中的下一个字母是否匹配。重复。 我更新了我的脚本。你能看看它,看看我是否更接近。我没有得到我想要的。 暂时忘记代码,先在纸上弄清楚。您需要遵守哪些规则?即,在每个字符串中的单个字母上都有一个“指针”点。如果字母相等,需要发生什么? (向前移动两个指针)如果它们不相等,会发生什么? (向前移动大指针,重置小指针)。我们什么时候停止移动指针?【参考方案2】:

我想有两种方法可以做到这一点。第一个基于您的方法。

boolean containmentCheck(String big, String small) 
    boolean contained;
        try 
            for (int i = 0; i < big.length(); i++) 
                contained = big.charAt(i) == small.charAt(0);
                if (contained) 
                    for (int j = 1; j < small.length(); j++) 
                        contained = big.charAt(i + j) == small.charAt(j);
                        if (!contained) 
                            i += j;
                            break;
                        
                        if (j == small.length() - 1)
                            return contained;
                    
                
            
            if (big.length() == 0 && small.length() == 0)
                contained = true;
         catch (IndexOutOfBoundsException e) 
            contained = true;
        
    return contained;

第二个完全不同,但我想你会发现它要简单得多。

boolean containmentCheck(String big, String small) 
    return big.contains(small);

这里要吸取的教训是:仔细阅读API。

【讨论】:

谢谢,只有当我可以使用 .contains(); .我们还没有学会休息;还没有。 @JeffTeague 好吧,你现在已经学会了。 break 将提前退出whilefordo 循环。应该说,有很多方法可以做到这一点。【参考方案3】:

另一种方法。基本上它与 Ekemark 相同。 您应该知道“继续”是什么。

boolean isStringSubString(String subStr, String mainStr) 
boolean isSubString = false;
//This is important. We need to loop only the difference of length times.
int max = mainStr.length() - subStr.length();

outerLoop : for (int i = 0; i <= max; i++)       
  int n = subStr.length();
  int j = i;
  int k = 0;
  while (n != 0) 
    if (mainStr.charAt(j++) != subStr.charAt(k++)) 
      continue outerLoop;
    
    n--;
  
  isSubString = true;
  break outerLoop;

return isSubString;

【讨论】:

以上是关于如何查看字符串是不是为子字符串。 Java [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在java中将字符串划分为子字符串

如何检查字符串是不是匹配某种日期格式?? JAVA [重复]

如何使用if来查看文件在shell bash脚本中是不是有后缀[重复]

如何查看 Java 1.4 中的另一个字符串中是不是存在子字符串?

如何在iOS上将字符串拆分为子字符串?

使用基本Java检查两个字符串是不是是彼此的字谜[重复]