2017-10-23 3 views
0

私はこの質問を受け取りました。教授は、論文を書くときに2人の学生が不正行為をしたかどうかを確認したいと考えています。関数を設計する:2つの文字列が長さNの共通部分文字列を持つ場合にtrueと評価されるhasCheated(String s1、String s2、int N)。実装後の追加の質問。 String.contains()とString.substring()を使用する可能性がないとします。これをどのように実装しますか?関数を設計しようとしています。評価するhasCheated(String s1、String s2、int N)

これは、私はそれを解決しようとしている方法です:

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; 


    } 


} 

私のクイズは、私は正しいことをやっていますか?前もって感謝します。

+1

次に、いや、あなたはそれを使用しているので、「あなたは()String.containsを使用する可能性はありませんと仮定」 – Nathan

+0

私は実際に勉強し、だから私は、その最初に試してみました。 – Leonard

答えて

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; 
} 


} 
+0

ありがとう、私は成功とそれを走った。 – Leonard

1

最初にこれを変更してください:<=s1.length()から<s1.length()、それ以外の場合はArrayOutOfIndex例外が発生します。

indexOf()を使用できます。あなたのロジックによる

0
  1. あなたが最初のスプリントを繰り返し処理しているので、それはより多くのSENSが

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

    を書くことになるだろう、あなたは長さNのストリングのいずれかのS1であれば理解しようとしていますs2に含まれています。

  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 
    } 
    

含まれているかのサブストリングがなければ、プリタムが述べたように、あなたはのindexOf()を使用することができ、あなたはまだストリングを交換する必要があります。これを行うには、あなたの文字列を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 
} 

は私のコードをよく見て、または任意のより良い方法が存在する場合、これはそう基本的に、これは私のアプローチだろう

+0

ありがとう、しかし、あなたはこれを実行することはできませんでした。comparisonString = String(tempCharArray); また、s1.length();です。 – Leonard

関連する問題