给出一个字符串输入:
aaabbbcccdddeee
输出应为:
abcde
我是如何制作这个节目的?
给定一个输入字符串,我已经使用冒泡排序[不需要现在有效的算法]按升序对此字符串的字符进行排序,然后删除重复项。
但问题是我无法在bbkjhiaa
之类的字符串字符串上应用此方法,因为它会更改原始字符串的顺序。
我需要使用数组和字符串的概念来编写代码。
class SingleOccurence
{
static String singleoccurence(String p)
{
char current = ch[0];
boolean found = false; //what is the use of boolean variable
for (int i = 0; i < ch.length; i++)
{
if (current == ch[i] && !found)
{
found = true;
}
else if (current != ch[i])
{
System.out.print(current);
current = ch[i];
found = false;
}
}
System.out.println(current);
String s4=new String(ch);
return s4;
}
public static void main(String s[])
{
String s1=new String("qwwnniitootiinn");
String s6=SortingDemo.bubble1(s1);
String s5=singleoccurence(s6);
}
}
答案 0 :(得分:1)
确实排序字符串是不可能的,因为这可能会改变输入。
你需要做的是将整个字符串放在一个数组中,然后从头到尾迭代数组。始终记住上次访问的值并与之进行比较。如果我们现在考虑的值与前一个相同,则跳过它,否则显示它。
public static String deDuplicate(char[] inpt) {
Set<Character> already_seen_chars = new HashSet<Character>();
String result = "";
for(int i = 0; i < inpt.length; i++) {
if(!already_seen_chars.contains(inpt[i])) { // Is the character already contained in the set?
result += Character.toString(inpt[i]);
already_seen_chars.add(inpt[i]);
}
}
return result;
}
public static void main(String[] args) {
String test = "ttttteeeeesssstttt";
System.out.println(deDuplicate(test.toCharArray()));
}
输入: qwwnniitootiinn ,输出: qwnito
请注意,性能也比以前更好,O(n)而不是O(n ^ 2)(其中n是字符串的长度)。
编辑:如果不允许使用Set数据结构,可以用for循环替换mySet.contains(...)
,循环遍历字符串并检查字符。
这给出了:
public static String deDuplicate(String input) {
char[] inpt = input.toCharArray();
String result = "";
for(int i = 0; i < inpt.length; i++) {
if(!contains(inpt, inpt[i], i)) { // Is the character already contained in the set?
result += Character.toString(inpt[i]);
}
}
return result;
}
contains
函数是:
public static boolean contains(char[] inpt, char c, int maxIndex) {
for(int i = 0; (i < inpt.length) && (i < maxIndex); i++) {
if(inpt[i] == c)
return true;
}
return false;
}
请注意,这会影响性能! for
中的deDuplicate
循环现在调用contains
,其中还包含for
循环。因此导致O(n ^ 2)性能。
答案 1 :(得分:1)
这对你有用:
public static void main(String[] args) {
String s = "aaabbbcccdddeee";
System.out.println(s.replaceAll("(.)(?=.*\\1)",""));
}
O / P:
abcde
输入:bbkjhiaa O / P:bkjhia
答案 2 :(得分:1)
取消重复数据的最简单方法是使用Set
,因为sets only allow each object in them to appear once。
示例:
String onlyUniqueCharacters(String s) {
final StringBuilder sb = new StringBuilder();
final Set<Character> uniqueChars = new HashSet<>();
for (int i = 0; i < s.length(); i++) {
final char c = s.charAt(i);
if (uniqueChars.add(c) sb.append(c);
}
return sb.toString();
}