我编写了以下Java
代码,以找到prefix
中suffix
与String
的{{1}}之间的交集。
Java
一些测试用例是:
// you can also use imports, for example:
// import java.math.*;
import java.util.*;
class Solution {
public int max_prefix_suffix(String S) {
if (S.length() == 0) {
return 1;
}
// prefix candidates
Vector<String> prefix = new Vector<String>();
// suffix candidates
Vector<String> suffix = new Vector<String>();
// will tell me the difference
Set<String> set = new HashSet<String>();
int size = S.length();
for (int i = 0; i < size; i++) {
String candidate = getPrefix(S, i);
// System.out.println( candidate );
prefix.add(candidate);
}
for (int i = size; i >= 0; i--) {
String candidate = getSuffix(S, i);
// System.out.println( candidate );
suffix.add(candidate);
}
int p = prefix.size();
int s = suffix.size();
for (int i = 0; i < p; i++) {
set.add(prefix.get(i));
}
for (int i = 0; i < s; i++) {
set.add(suffix.get(i));
}
System.out.println("set: " + set.size());
System.out.println("P: " + p + " S: " + s);
int max = (p + s) - set.size();
return max;
}
// codility
// y t i l i d o c
public String getSuffix(String S, int index) {
String suffix = "";
int size = S.length();
for (int i = size - 1; i >= index; i--) {
suffix += S.charAt(i);
}
return suffix;
}
public String getPrefix(String S, int index) {
String prefix = "";
for (int i = 0; i <= index; i++) {
prefix += S.charAt(i);
}
return prefix;
}
public static void main(String[] args) {
Solution sol = new Solution();
String t1 = "";
String t2 = "abbabba";
String t3 = "codility";
System.out.println(sol.max_prefix_suffix(t1));
System.out.println(sol.max_prefix_suffix(t2));
System.out.println(sol.max_prefix_suffix(t3));
System.exit(0);
}
}
,预期值为:
String t1 = "";
String t2 = "abbabba";
String t3 = "codility";
我的想法是制作1, 4, 0
个候选人并将其推入向量,然后找到prefix
个候选人并将其推入suffix
,最后同时推送vector
进入vectors
,然后计算差异。但是,我得到了Set
。有人可以帮我弄清楚我做错了吗?
答案 0 :(得分:2)
我会按如下方式编写您的方法:
public int max_prefix_suffix(String s) {
final int len = s.length();
if (len == 0) {
return 1; // there's some dispute about this in the comments to your post
}
int count = 0;
for (int i = 1; i <= len; ++i) {
final String prefix = s.substring(0, i);
final String suffix = s.substring(len - i, len);
if (prefix.equals(suffix)) {
++count;
}
}
return count;
}
如果你需要将前缀与后缀的 reverse 进行比较,我会这样做:
final String suffix = new StringBuilder(s.substring(len - i, len))
.reverse().toString();
答案 1 :(得分:0)
我看到@ted Hop的代码很好.. 该问题指定返回给定String的后缀和前缀中的最大匹配字符数,这是一个合适的子集。因此,对于此最大数字,不考虑整个字符串。
实施例。 “abbabba”,前缀和后缀可以有abba(前4个字符) - abba(最后4个字符),因此长度为4 codility ,,前缀(c,co,cod,codi,co ...),, sufix(y,ty,ity,lity ....),它们都不相同。 因此这里的长度是0。
通过此处修改计数
if (prefix.equals(suffix)) {
++count;
}
带
if (prefix.equals(suffix)) {
count = prefix.length();// or suffix.length()
}
我们得到最大长度。 但这可以在O(n)中完成..字符串的内置函数等于,我相信会花费O(n),因此整体复杂度为O(n2)......
答案 2 :(得分:0)
我会使用这段代码。
public static int max_prefix_suffix(String S)
{
if (S == null)
return -1;
Set<String> set = new HashSet<String>();
int len = S.length();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < len - 1; i++)
{
builder.append(S.charAt(i));
set.add(builder.toString());
}
int max = 0;
for (int i = 1; i < len; i++)
{
String suffix = S.substring(i, len);
if (set.contains(suffix))
{
int suffLen = suffix.length();
if (suffLen > max)
max = suffLen;
}
}
return max;
}
答案 3 :(得分:0)
@ ravi.zombie 如果你需要O(n)中的长度,那么你只需要改变Ted的代码如下:
int max =0;
for (int i = 1; i <= len-1; ++i) {
final String prefix = s.substring(0, i);
final String suffix = s.substring(len - i, len);
if (prefix.equals(suffix) && max < i) {
max =i;
}
return max;
}
我也省略了整个字符串比较以获得正确的前缀和后缀,因此对于输入字符串abbabba,这应该返回4而不是7。