如何避免在字符串中打印重复的特殊字符?

时间:2019-10-02 10:51:01

标签: java c++

我有一个包含特殊字符的字符串。我想打印它们,但不要打印重复的。

Input String s="&*$%) )_@*% &)((("
Ouput ="&*$%)_@("

3 个答案:

答案 0 :(得分:1)

这里是C ++版本,您可以在其中使用bitset来跟踪已经看到的唯一字符。

#include <iostream>
#include <string>
#include <bitset>

bool IsSpecialChar(const unsigned char& c) {
    // your treatment to decide if the character is "special"
    return (c < 'a' || c > 'z') 
        && (c < 'A' || c > 'Z')
        && (c < '0' || c > '9')
        && (c != ' ');
}

std::string StripDuplicates(const std::string& str) {

   std::bitset<256> alreadySeen;

   std::string result;

   for (const unsigned char& c : str) {
      if (!alreadySeen[c] && IsSpecialChar(c)) {
         result += c;
         alreadySeen[c] = true;
      }
   }

   return result;
}

int main(int argc, char * argv[]) {

   std::string testString = "aazrr554AZEZAAZZ&*$%) )_@*% &)(((";

   std::string result = StripDuplicates(testString);

   std::cout << result << std::endl;
}

编辑:如果要过滤要保留的字符是否为“特殊字符”,则可能要在将“ c”附加到“结果”之前添加该检查。我编辑了代码以反映这一点。

答案 1 :(得分:0)

首先,在Java中,我们需要将这些字符添加到HashSet(HashSet是仅保留唯一值的列表),然后我们将使用字符串生成器使用这些唯一值创建字符串,就是这样,您可以自己检查代码< / p>

import java.util.*;

class Main {
  public static void main(String[] args) {
   String ss = "&*$%) )_@*% &)(((";
   Set<Character> set = new HashSet<>();
   StringBuilder output 
            = new StringBuilder(); 


  for (int i = 0; i < ss.length(); i++) {
      set.add(ss.charAt(i));
  }

  for (Character c : set) {
      output.append(c);
  }

  System.out.println(output);


  }
}

答案 2 :(得分:0)

从Redgis那里获取答案,并使用std::copy_if算法功能:

#include <iostream>
#include <string>
#include <bitset>
#include <iterator>
#include <algorithm>

std::string StripDuplicates(const std::string& str) {

   std::bitset<256> alreadySeen;
   std::string result;
   std::copy_if(str.begin(), str.end(), std::back_inserter(result),
                [&](char ch) 
                {bool seen = alreadySeen[static_cast<unsigned char>(ch)]; 
                             alreadySeen.set(ch); return !seen;});
   return result;
}

int main(int argc, char * argv[]) {
   std::string testString = "&*$%) )_@*% &)(((";
   std::string result = StripDuplicates(testString);
   std::cout << result << std::endl;
}

输出:

&*$%) _@(