【问题标题】:Separate string in cluster strings of repeated values in same order as they appear in original string在重复值的簇字符串中以与它们在原始字符串中出现的相同顺序分隔字符串
【发布时间】:2020-05-29 12:35:47
【问题描述】:

我有一个包含两个字符的字符串。当它们组合在一起时,我需要将字符串分成小的字符簇。 假设我的字符串是 "xxxxxxxxyyxyxxxxyyyyyxyxxxxyyyyyyyxyyxyyyyyxyyyxxxyyyyxyyy"

我现在需要一个数组、一个列表,无论它读起来像什么: [["xxxxxxxx"],["yy"],["x"],["y"],["xxxx"],["yyyyy"],["x"],["y"],["xxxx"],["yyyyyyy"],["x"],["yy"],["x"],["yyyyy"],["x"],["yyy"],["xxx"],["yyyy"],["x"],["yyy"]]

我需要保持顺序,因为我会对其进行迭代,然后相应地在集群中进行更改。我就是找不到办法。

【问题讨论】:

  • 你知道这两个字符吗?还是它们是随机的?

标签: java arrays string algorithm


【解决方案1】:

您只需要从头到尾扫描字符串并检查连续的xs 和ys 并收集它们。

for ( int i = 0; i < s.length(); ) {
   int sz = list.size();
   int j = i;
   while ( i < s.length() && s.charAt(i) == 'x' ) i++;
   if ( i > j )  list.add(s.substring(j,i));
   j = i;
   while ( i < s.length() && s.charAt(i) == 'y' ) i++;
   if ( i > j ) list.add(s.substring(j,i));
   if ( sz == list.size() ) i++;
}

【讨论】:

    【解决方案2】:

    例如,如果您有字母“x”和“y”,则可以使用 RegExp 模式

    (x+|y+)

    找到你的集群。

        public String[] separateString(String s, String firstSymbol, String secondSymbol){
            List<String> l = new ArrayList<>();
            Pattern pattern = Pattern.compile("(" + firstSymbol + "+|" + secondSymbol + "+)");
            Matcher matcher = pattern.matcher(s);
            while(matcher.find()){
                l.add(matcher.group(1));
            }
            return l.toArray(new String[0]);
        }
    

    如果您有正则表达式的特殊字符,例如“+”或“.”,则需要在此解决方案中屏蔽它们:

        String s = "+++---";
        String first = "\\+";
        String second = "-";
        String[] result = separateString(s, first, second);
    

    【讨论】:

      【解决方案3】:

      您可以使用单个 for 循环扫描字符串。只需检查前一个字符。如果它们相同,则继续,否则将前一个子字符串添加到结果中。你可以使用一个指针变量,比如start,它表示前一个子字符串从哪里开始。下面的代码也适用于除 xy 之外的任何类型的字符。

      片段:

      import java.util.*;
      public class Main{
          public static void main(String[] args) {
              String s = "xxxxxxxxyyxyxxxxyyyyyxyxxxxyyyyyyyxyyxyyyyyxyyyxxxyyyyxyyy";
              List<String> res = new ArrayList<>();
              int start = 0;
              for(int i=1;i<s.length();++i){
                  if(s.charAt(i) != s.charAt(i-1)){
                      res.add(s.substring(start,i));
                      start = i;
                  }
              }
              res.add(s.substring(start,s.length())); // to add last unadded substring of same characters
              System.out.println(res.toString());
          }
      }
      

      演示: https://onlinegdb.com/SkRqmAQQU

      【讨论】:

        【解决方案4】:

        编辑:查看 SomeDude 的回答,比我的要好得多。

        如果需要,SomeDude 的答案可以推广到任意数量的符号:

        List<String> clusters = new ArrayList<String>();
        for(int i = 0; i < s.length();)
        {
            int j = i;
            while(i < s.length() && s.charAt(i) == s.charAt(j)) i++;
            if(i > j) clusters.add(s.substring(j, i));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-17
          • 2017-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多