试图设计一个函数:hasCheated(String s1,String s2,int N)进行求值

时间:2017-10-23 23:16:38

标签: java

我有这个问题:一位教授想看看两个学生在写论文时是否作弊。设计一个函数:hasCheated(String s1,String s2,int N),如果两个字符串的长度为N的公共子字符串,则求值为true。实现后的其他问题。假设您没有使用String.contains()和String.substring()的可能性。你会如何实现这个?

这就是我试图解决的问题:

public class exercise {


    public static void main(String[] args){
        String s1 ="";
        String s2 = "";
        int n=0;

        boolean s3;
        for(int i=0; i<=s1.length();i++){
            if(i+n <=s1.length()){
                if(s3=s1.contains(s2.substring(i, i+n)));

                System.out.printf("HasCheated\n ",s3);
                //return true;
            }
        }

        //return false;


    }


}

我的测验是,我正在做正确的事情?提前谢谢。

3 个答案:

答案 0 :(得分:1)

首先将此更改为<=s1.length()<s1.length(),否则您将获得ArrayOutOfIndex例外。

您可以使用indexOf()

答案 1 :(得分:1)

所以基本上这将是我的方法:

@Pritam是正确的,如果你想这样做,但是,假设你没有可能使用String.contains()和String.substring()。我就是这样做的。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class exercise{
public static void main(String[] args) {

    String s1="home";
    String s2="homework";
    int n=4;
    exercise p=new exercise();

    if(p.hasCheated(s1, s2, n))
    {
        System.out.println("Student Cheated ");
        return;
    }

    System.out.println("Not Cheated");



}

public boolean hasCheated(String s1,String s2, int N)
{
    boolean s3=true;
    ArrayList<String> al=new ArrayList<String>();
    ArrayList<String> bl=new ArrayList<String>();

    al.addAll(getInfo(s1,N));
    bl.addAll(getInfo(s2,N));
    al.retainAll(bl);
    if(al.size()==0)
    {
        s3=false;
    }
    return s3;

}

public List<String> getInfo(String s,int n)
{
    ArrayList<String> inf=new ArrayList<String>();
    inf.clear();
    String myStr=Arrays.toString(s.split("(?<=\\G.{4})"));

    Scanner sc=new Scanner(myStr).useDelimiter(",");
    while(sc.hasNext())
    {
        String myString=sc.next().replaceAll("\\W", "");

        inf.add(myString);
    }

    return inf;
}


}

答案 2 :(得分:0)

  1. 按照你的逻辑,写出来会更有感觉

    if(s3=s2.contains(s1.substring(i, i+n)));
    

    因为你正在迭代你的第一个sprint,你试图找出s1中是否包含s1中任何长度为N的子串。

  2. 您不需要布尔值,它不会向代码添加任何值。

    public hasCheated(String s1, String s2, int n){
     for(int i=0; i < s1.length; i++){
       if(i + n < s1.length){
         if(s2.contains(si.substring(i,i+n))){
           return true;
         }
       }
     }
     return false
    }
    
  3. 如果没有contains或substring,你可以使用indexOf()作为Pritam提到的,但你仍然需要替换子字符串。为此,您可以将字符串转换为charArray并使用索引。它确实增加了复杂性。

    public hasCheated(String s1, String s2, int n){
      char[] tempCharArray;
      char[] charString = s1.toCharArray();
      String comparedString = "";
      for(int i=0; i < s1.length; i++){
        if(i + n < s1.length){
          for(int j = 0; j<n ; j++){
            tempCharArray[j] = charString[i+j];
          }
          comparedString = String(tempCharArray);
          if(s2.indexOf(comparedString) > 0){
            return true;
          }
        }
      }
      return false
    }
    

    我没有密切关注我的代码,或者是否存在更好的方法,但这可行