我正在尝试解决这个问题。我已经看到了其他涉及列表和使用递归的解决方案,但是我对学习如何使用循环来解决这个问题很感兴趣,而且似乎无法获得正确的输出。 (即没有正则表达式,没有元组,没有字符串方法等)
input: caaabbbaacdddd
expected output:empty string
input:abbabd
expected output:bd
下面是我的代码,我发现其他解决此问题的方法只是寻找最基本的解决方案。
answer = input("enter a string: ")
new_answer = ""
#while answer != new_answer:
if answer == "":
print("goodBye!")
#break
p = ""
for c in answer:
if p != c:
new_answer += p
p = c
else:
p = c
print(new_answer)
被注释掉的部分是使整个程序循环遍历,以确保不再重复。
答案 0 :(得分:0)
最简单的基于循环的解决方案是:
result = ""
for i in answer:
if result == "" or result[-1] != i:
result += i
您还可以使用itertools.groupby
来满足您的需求:
print("".join([i for i in map(lambda x: x[0], itertools.groupby(answer))])
答案 1 :(得分:0)
似乎您只是在比较当前字符和前一个字符。您可以使用in
运算符:
if char in String
所有26个字符
如果可以使用字典,则还可以为所有26个字符制作字典(因为您仅使用循环)
答案 2 :(得分:0)
试试看!在您的逻辑中,唯一的问题是您不会删除在new_answer中添加了重复字符。
count = 0
for c in answer:
if p != c:
new_answer += p
p = c
else:
new_answer = new_answer.replace(c,””,count)
p = c
count += 1
print(new_answer)
在没有替换功能的情况下进一步简化操作
count = 0
for c in answer:
if p != c:
new_answer += p
p = c
else:
if count == 0:
new_answer =“”
else:
new_answer=new_answer[:count-1]
count -=1
p = c
count += 1
print(new_answer)
答案 3 :(得分:0)
我会用javascript做到这一点(我知道它不是python,但是逻辑相同):
let answer = 'acacbascsacasceoidfewfje';
for(i=0;i<answer.length;i++){
if(obj[answer.substr(i,1)] === undefined){
obj[answer.substr(i,1)] = 1
}else{
obj[answer.substr(i,1)]++;
}
}
JSON.stringify(obj)
结果:
“ {” a“:4,” c“:4,” b“:1,” s“:2,” e“:2,” o“:1,” i“:1,” d“ :1,“ f”:1,“ w”:1,“ j”:1}“
答案 4 :(得分:0)
public class RemoveAdjacentDuplicates {
public static void main(String[] args) {
System.out.println(removeDuplicates("abbabd"));
}
public static String removeDuplicates(String S) {
char[] stack = new char[S.length()];
int i = 0;
for(int j = 0 ; j < S.length() ; j++) {
char currentChar = S.charAt(j);
if(i > 0 && stack[i-1] == currentChar) {
i--;
}else {
stack[i] = currentChar;
i++;
}
}
return new String(stack , 0 , i);
}
}
该程序的结果是:
input: caaabbbaacdddd
output:empty string
input:abbabd
output:bd