遇到一个编程练习,被卡住了。问题是:
您需要为电子邮件定义有效的密码,但唯一的限制是:
现在,给定一个字符串,找到最长的子字符串的长度,这是一个有效的密码。例如,对于Input Str = "a0Ba"
,输出应为2,因为"Ba“是有效子字符串。
我使用了最长的子串的概念,没有重复的字符,我已经这样做了,但无法修改它来找到上述问题的解决方案。我对没有重复字符的最长子串的代码是:
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;
}
发布于 2016-09-08 22:09:09
怎么样
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();
获取字符串的长度。
发布于 2016-09-08 18:48:22
我建议您将字符串拆分为一个不带数字的字符串数组:
yourString.split("[0-9]")
然后迭代此数组(表示数组a),以获得包含一个大写字符的最长字符串:
a[i].matches("[a-z]*[A-Z]{1}[a-z]*");
发布于 2016-09-08 18:38:17
你可以使用一个简单的数组。要使用的算法将是动态滑动窗口。下面是一个静态滑动窗口的示例:What is a Sliding Window
算法如下:
跟踪char
数组的2个索引。这两个索引在这里分别称为front
和back
,表示数组的前面和后面。
有一个int
(我在这里将其命名为up
)来跟踪大写char
的编号。
将全部设置为0。
使用while循环,该循环在front > N
时终止,其中N
是给定的char
数。
如果下一个字符不是数字,则在front
上加1。然后检查该char
是否为大写。如果是,则在up
上加1。
如果up
至少为1,则根据需要更新最大长度。
如果下一个字符是数字,如果它们也是数字,则继续检查以下char
。将front
设置为char
不是数字的第一个索引,将back
设置为front-1
。
输出最大长度。
https://stackoverflow.com/questions/39388558
复制相似问题