3

我的字符串是"AAABBAABABB",我想得到结果

A = 3
B = 2
A = 2
B = 1 
A = 1
B = 2

我试过用

for (int i = 0; i < n - 1; i++) {
    if (msg[i] == msg[i + 1]) {
        if(msg[i]==A)
            a++;
        else
            b++;
    }
}

我试过了,它对我不起作用。而且我不知道是否有任何其他方法可以找到它。请帮帮我。

4

5 回答 5

5

通过以下方式遍历数组:

  1. 如果 i = 0,我们可以将变量设置为第 0 个字符,计数器加 1。
  2. 如果第 i 个字符等于前一个字符,我们可以增加计数器。

  3. 如果第 i 个字符不等于第 (i-1) 个字符,我们可以打印该字符,计数器并开始计算新字符。

尝试以下代码段:

char ch = msg[0];
int cnt = 1;

for (int i = 1; i < n; i ++){
   if(msg[i] != msg[i-1]){
      cout<<ch<<" "<<cnt<<endl;
      cnt = 1;
      ch = msg[i];
   }
   else {
      cnt++;
   }
}

cout<<ch<<" "<<cnt<<endl;
于 2020-05-05T07:28:56.493 回答
4

您可以使用std::vector<std::pair<char, std::size_t>>来存储字符的出现。

最终,你会得到类似的东西:

#include <iostream>
#include <utility>
#include <vector>
#include <string>

int main() {
    std::vector<std::pair<char, std::size_t>> occurrences;
    std::string str{ "AAABBAABABB" };

    for (auto const c : str) {
        if (!occurrences.empty() && occurrences.back().first == c) {
            occurrences.back().second++;
        } else {
            occurrences.emplace_back(c, 1);
        }
    }

    for (auto const& it : occurrences) {
        std::cout << it.first << " " << it.second << std::endl;
    }

    return 0;
}

它将输出:

A 3
B 2
A 2
B 1
A 1
B 2

演示

于 2020-05-05T07:39:43.227 回答
3

这与游程编码非常相似。我认为我能想到的最简单的方法(更少的代码行)是这样的:

void runLength(const char* msg) {
    const char *p = msg;
    while (p && *p) {
        const char *start = p++;  // start of a run
        while (*p == *start) p++;  // move p to next run (different run)
        std::cout << *start << " = " << (p - start) << std::endl;
    }
}

请注意:

  1. 这个函数不需要事先知道输入字符串的长度,它会在字符串的结尾处停止,'\0'。
  2. 它也适用于空字符串和 NULL。这两个工作:runLength(""); runLength(nullptr); 我还不能评论,如果你仔细看,mahbubcseju 的代码不适用于空味精。
于 2020-05-05T11:45:33.947 回答
1

使用 std,您可以执行以下操作:

void print_sequence(const std::string& s)
{
    auto it = s.begin();    
    while (it != s.end()) {
        auto next = std::adjacent_find(it, s.end(), std::not_equal_to<>{});
        next = next == s.end() ? s.end() : next + 1;

        std::cout << *it << " = " << std::distance(it, next) << std::endl;
        it = next;
    }
}

演示

于 2020-05-05T08:03:44.163 回答
1

欢迎来到stackoverflow。哦,算法问题?我将添加一个递归示例:

#include <iostream>

void countingThing( const std::string &input, size_t index = 1, size_t count = 1 ) {
   if( input.size() == 0 ) return;

   if( input[index] != input[index - 1] ) {
      std::cout << input[index - 1] << " = " << count << std::endl;
      count = 0;
   }

   if( index < input.size() ) return countingThing( input, index + 1, count + 1 );
}

int main() {
   countingThing( "AAABBAABABB" );
   return 0;
}

为了帮助制定算法并弄清楚要在代码中写什么,我建议几个步骤:

首先,以多种方式写出你的问题,它期望什么样的输入,以及你希望输出如何。

其次,试着在纸上解决它,逻辑是如何工作的——一个很好的提示是尝试理解你将如何解决它。你的大脑是一个很好的问题解决者,如果你能倾听它的作用,你就可以把它变成代码(虽然它并不总是最有效的)。

第三,把它写在纸上,看看你的解决方案是否符合你的预期。然后你可以将解决方案翻译成代码,确切地知道你需要写什么。

于 2020-05-05T08:20:02.837 回答