Java在字符串中搜索有效的字符序列

时间:2015-10-18 19:30:32

标签: java string validation testing

我刚接受了一项痘痘测试,并想知道为什么我的解决方案只获得了37/100。问题是您获得了String并且必须在其中搜索有效密码。 以下是规则:

1)有效密码以大写字母开头,不能包含任何数字。输入仅限于a-z,A-Z和0-9的任意组合。

2)他们希望您创建的方法是返回最大有效密码的大小。因此,例如,如果您输入" Aa8aaaArtd900d" ,则假设数字4由解决方法输出。如果找不到有效的String,则该方法应返回-1

我似乎无法弄清楚我的解决方案出了什么问题。任何帮助将不胜感激!此外,对于如何更好地测试此类代码的任何建议都将非常感激。

class Solution2 {
public int solution(String S) {
    int first = 0;
    int last = S.length()-1;
    int longest = -1;
    for(int i = 0; i < S.length(); i++){
        if(Character.isUpperCase(S.charAt(i))){
        first = i;
        last = first;
        while(last < S.length()){
                 if(Character.isDigit(S.charAt(last))){
                    i = last;
                    break;
                    }
                 last++;
            }    
        longest = Math.max(last - first, longest);
        }
     }
    return longest;    
 }
}

添加了更新的解决方案,是否有任何想法进一步优化?

1 个答案:

答案 0 :(得分:1)

你的解决方案太复杂了。由于没有要求您找到最长密码,只有最长密码的长度,因此没有理由创建或存储具有该最长密码的字符串。因此,您无需使用substringString个数组,只需使用int个变量。

找到解决方案的算法很简单:

  1. int pos = 0
  2. 中创建一个代表当前位置的s变量
  3. 制作一个搜索下一个候选密码的循环
  4. 从位置pos开始,找到下一个大写字母
  5. 如果您点击了行尾,请退出
  6. 从大写字母的位置开始,找到下一个数字
  7. 如果您到达行尾,请停止
  8. 找出数字位置(或行尾)与大写字母位置之间的差异。
  9. 如果差异高于您之前找到的max,请将max替换为差异
  10. pos提升到最后一个字母(或行尾)的位置
  11. 如果pos位于s.length下,请继续执行第2步中的循环
  12. 返回max
  13. Demo.