地址;

1717. 删除子字符串的最大得分

状态:未AC

代码:贪心

【无需额外空间】贪心算法

image.png

  1. class Solution {
  2. public:
  3. int maximumGain(string s, int x, int y) {
  4. int n = s.length();
  5. if (x < y) {
  6. swap(x, y);
  7. for (int i = 0; i < n; i++) {
  8. if (s[i] == 'a') s[i] = 'b';
  9. else if (s[i] == 'b') s[i] = 'a';
  10. }
  11. }
  12. int ret = 0;
  13. int i = 0;
  14. while (i < n) {
  15. while (i < n && s[i] != 'a' && s[i] != 'b') i++;
  16. int ca = 0, cb = 0;
  17. while (i < n && (s[i] == 'a' || s[i] == 'b')) {
  18. if (s[i] == 'a') {
  19. ca++;
  20. } else {
  21. if (ca > 0) {
  22. ca--;
  23. ret += x;
  24. } else {
  25. cb++;
  26. }
  27. }
  28. i++;
  29. }
  30. ret += min(ca, cb) * y;
  31. }
  32. return ret;
  33. }
  34. };

思路相同,没有字符串转换

  1. /*
  2. * ab -> x
  3. * ba -> y
  4. * 贪心的先去构建价值高的情况甲的,这样子剩下就只有可能情况乙
  5. */
  6. class Solution {
  7. public:
  8. int maximumGain(string s, int x, int y) {
  9. int a=0,b=0;
  10. s+='-';
  11. int ans=0;
  12. for (char i:s) {
  13. if (i=='a' || i=='b') {
  14. if (i=='a') {
  15. a++;
  16. } else {
  17. b++;
  18. }
  19. if (x>=y && i=='b' && a>0) {
  20. a--;
  21. b--;
  22. ans+=x;
  23. } else if (x<=y && i=='a' && b>0) {
  24. a--;
  25. b--;
  26. ans+=y;
  27. }
  28. } else {
  29. int cho=min(a,b);
  30. int val=min(x,y);
  31. ans+=cho*val;
  32. a=b=0;
  33. }
  34. }
  35. return ans;
  36. }
  37. };