Java 替换字符串中的所有连续重复项,但不允许出现
我需要编写一个方法,该方法将字符串作为参数,并返回一个新字符串,该字符串是通过将重复的相邻字母的每个实例替换为该字符串的Java 替换字符串中的所有连续重复项,但不允许出现,java,string,algorithm,Java,String,Algorithm,我需要编写一个方法,该方法将字符串作为参数,并返回一个新字符串,该字符串是通过将重复的相邻字母的每个实例替换为该字符串的'n'实例而获得的 例如,如果“aaabcccd”作为输入字符串,并且n=2,则返回“aabccd”。我已经尝试了以下代码,但没有得到预期的输出 String in = "aaadbbb"; char[] s = in.toCharArray(); int len = s.length;
'n'
实例而获得的
例如,如果“aaabcccd”
作为输入字符串,并且n=2
,则返回“aabccd”
。我已经尝试了以下代码,但没有得到预期的输出
String in = "aaadbbb";
char[] s = in.toCharArray();
int len = s.length;
int n = 2;
StringBuffer new_s = new StringBuffer("");
int count = 1;
char prev='\0';
for (int i = 0; i < len - 1; i++) {
if (s[i] == s[i + 1]) {
if(count <= n){
new_s.append(s[i]);
count++;
}else{
count=1;
}
} else {
new_s.append(s[i]);
}
}
System.out.println(new_s);
String in=“aaadbbb”;
char[]s=in.toCharArray();
int len=s.长度;
int n=2;
StringBuffer new_s=新的StringBuffer(“”);
整数计数=1;
char prev='\0';
对于(int i=0;i 如果(count我认为你的思路是对的。我不确定这是否是一项作业,所以我不想直接给你一个答案,但这里有一些提示可能会有所帮助:
您已经在对字符串进行迭代。这很好!但是,我认为您希望将当前字符与前一个字符进行比较,而不是下一个字符
您不需要将输入转换为字符数组进行迭代,只需使用charAt(idx)
您似乎从未使用过prev,但我认为您在声明它时的想法是正确的
将问题分为两部分:何时更新计数和何时追加字符。您可以在for循环中处理这两个问题,但不要尝试在相同的if语句中同时处理这两个问题,而是将其分为多个if
要做的三件事是:
- 更新上一个值
- 更新计数
- 更新新字符串
要获得这些的正确顺序和具体实现,我将留给您(同样,因为我不确定这是否是一项任务)
更新:由于其他人发布,以下是我的解决方案(使用单for循环):
私有字符串替换连续副本(字符串输入,int n){
if(input==null | | input.length()n)继续;
}否则{
计数=1;
}
prev=当前值;
某人(现任);
}
使某人返回字符串();
}
可以使用regexp-magic使用反向引用完成
String in = "aaaaddbbbbc";
int n = 2;
String pattern = String.format("(([a-z])\\2{%d})\\2+", n - 1);
System.out.println(in.replaceAll(pattern, "$1"));
产出:
aaddbbc
说明:
{}
中的数字是n-1
([a-z])
是一个捕获组,匹配从a到z的任何一个小写字母。由于它是表达式中的第二组括号,因此可以将其引用为2
(([a-z])\\2{n}
表示“匹配相同字母的n+1个重复”。它构成第一个捕获组,我们将使用它作为替换
\\2+
匹配同一字母的所有额外重复。它们在替换后被丢弃。公共静态字符串测试(字符串输入,int重复){
public static String test(String input, int repetitions) {
String flag = "";
String replacement = "";
String output = input;
ArrayList<Character> prevLetters = new ArrayList<Character>();
for(int x = 0; x < input.length(); x++) {
if(!prevLetters.contains(input.charAt(x))) {
for(int y = 0; y <= repetitions ; y++) {
flag += String.valueOf(input.charAt(x));
}
if(input.contains(flag)) {
replacement = flag.substring(0, flag.length()-1);
while(output.contains(flag)){
output = output.replace(flag, replacement);
}
}
flag = "";
prevLetters.add(input.charAt(x));
}
}
return output;
}
字符串标志=”;
字符串替换=”;
字符串输出=输入;
ArrayList prevLetters=新的ArrayList();
对于(int x=0;x 对于(int y=0;y添加一个替代方案:
String in = "aaadbbbjjkllllllopp";
int n = 2;
StringBuilder sb = new StringBuilder();
char temp = in.charAt(0);
for(int i = 0; i < in.length()-1;){ // note that the incrementation of i is moved to the while loop
temp = in.charAt(i); // save current char in temp variable
int count = 0;
while (i < in.length() && in.charAt(i) == temp) { ///iterate as long as you find same chars or hit the end of the string
i++;
count++;
}
if (count > n){ // if and only if count is greater than max allowed set it to max allowed
count = n;
}
for(int j = 0; j < count; j++){ // append count chars
sb.append(temp);
}
}
System.out.println(sb.toString());
String in=“aaadbbbjklllllllllpp”;
int n=2;
StringBuilder sb=新的StringBuilder();
字符温度=英寸字符(0);
对于(inti=0;in){//如果且仅当计数大于允许的最大值时,将其设置为允许的最大值
计数=n;
}
对于(int j=0;j
看看这个解决方案。您应该注意输入字符串中的最后一个字符,因为您只迭代到最后一个字符,而不是一个字符
private void replaceConsecutiveDuplicates() {
String input = "aaadbbb";
int n = 2;
StringBuffer sb = new StringBuffer();
int count = 1;
char current;
for( int i = 0; i < input.length(); ++i){
current = input.charAt(i);
if (i + 1 < input.length() && current == input.charAt(i + 1)) {
++count;
} else if (count > 1) {
for(int j = 0; j < n; ++j) {
sb.append(current);
}
count = 1;
}
else {
sb.append(current);
}
}
System.out.println(sb.toString());
}
private void replacementContinuedDuplicates(){
字符串输入=“aaadbbb”;
int n=2;
StringBuffer sb=新的StringBuffer();
整数计数=1;
炭流;
对于(int i=0;i1){
对于(int j=0;j
你能解释一下你的代码背后的逻辑吗?谢谢,Alex,但我想问你,只有一个for循环就足够了吗?是的,你可以在一个for循环中完成这项工作。“三件事”都发生在其中:)我已经用单循环解决方案更新了我的答案。非常有趣的方法。你能调整它以适应可变长度吗?当然。更新了答案以说明这一点。