首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java:查找不包含任何数字和至少一个大写字符的最长子字符串

Java:查找不包含任何数字和至少一个大写字符的最长子字符串
EN

Stack Overflow用户
提问于 2016-09-08 18:28:40
回答 16查看 8.1K关注 0票数 2

遇到一个编程练习,被卡住了。问题是:

您需要为电子邮件定义有效的密码,但唯一的限制是:

  • 密码必须包含一个大写字符
  • 密码不能包含数字

现在,给定一个字符串,找到最长的子字符串的长度,这是一个有效的密码。例如,对于Input Str = "a0Ba",输出应为2,因为"Ba“是有效子字符串。

我使用了最长的子串的概念,没有重复的字符,我已经这样做了,但无法修改它来找到上述问题的解决方案。我对没有重复字符的最长子串的代码是:

代码语言:javascript
复制
public int lengthOfLongestSubstring(String s) {
    int n = s.length();
    Set<Character> set = new HashSet<>();
    int ans = 0, i = 0, j = 0;
    while (i < n && j < n) {
        // try to extend the range [i, j]
        if (!set.contains(s.charAt(j))){
            set.add(s.charAt(j++));
            ans = Math.max(ans, j - i);
        }
        else {
            set.remove(s.charAt(i++));
        }
    }
    return ans;
}
EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2016-09-08 22:09:09

怎么样

代码语言:javascript
复制
final String input = "a0Ba";

final int answer = Arrays.stream(input.split("[0-9]+"))
    .filter(s -> s.matches("(.+)?[A-Z](.+)?"))
    .sorted((s1, s2) -> s2.length() - s1.length())
    .findFirst()
    .orElse("")
    .length();

out.println(answer);

Arrays.stream(input.split("[0-9]+"))将原始字符串拆分为字符串数组。分隔符可以是任何数字序列(不允许数字,因此它们用作分隔符)。然后,创建一个流,以便我可以应用函数操作和转换。

.filter(s -> s.matches("(.+)?[A-Z](.+)?"))只在流中保留至少有一个大写字母的字符串。

.sorted((s1, s2) -> s2.length() - s1.length())按长度(desc)对流进行排序。

.findFirst()尝试获取流的第一个字符串。

如果未找到字符串,则.orElse("")将返回空字符串。

.length();获取字符串的长度。

票数 4
EN

Stack Overflow用户

发布于 2016-09-08 18:48:22

我建议您将字符串拆分为一个不带数字的字符串数组:

代码语言:javascript
复制
yourString.split("[0-9]")

然后迭代此数组(表示数组a),以获得包含一个大写字符的最长字符串:

代码语言:javascript
复制
a[i].matches("[a-z]*[A-Z]{1}[a-z]*"); 
票数 2
EN

Stack Overflow用户

发布于 2016-09-08 18:38:17

你可以使用一个简单的数组。要使用的算法将是动态滑动窗口。下面是一个静态滑动窗口的示例:What is a Sliding Window

算法如下:

跟踪char数组的2个索引。这两个索引在这里分别称为frontback,表示数组的前面和后面。

有一个int (我在这里将其命名为up )来跟踪大写char的编号。

将全部设置为0。

使用while循环,该循环在front > N时终止,其中N是给定的char数。

如果下一个字符不是数字,则在front上加1。然后检查该char是否为大写。如果是,则在up上加1。

如果up至少为1,则根据需要更新最大长度。

如果下一个字符是数字,如果它们也是数字,则继续检查以下char。将front设置为char不是数字的第一个索引,将back设置为front-1

输出最大长度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39388558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档