我有这个问题:一位教授想看看两个学生在写论文时是否作弊。设计一个函数: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;
}
}
我的测验是,我正在做正确的事情?提前谢谢。
答案 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)
按照你的逻辑,写出来会更有感觉
if(s3=s2.contains(s1.substring(i, i+n)));
因为你正在迭代你的第一个sprint,你试图找出s1中是否包含s1中任何长度为N的子串。
您不需要布尔值,它不会向代码添加任何值。
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
}
如果没有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
}
我没有密切关注我的代码,或者是否存在更好的方法,但这可行