821. 字元的最短距離(C++)
阿新 • • 發佈:2018-12-12
給定一個字串 S
和一個字元 C
。返回一個代表字串 S
中每個字元到字串 S
中的字元 C
的最短距離的陣列。
示例 1:
輸入: S = "loveleetcode", C = 'e' 輸出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]
說明:
- 字串
S
的長度範圍為[1, 10000]
。 C
是一個單字元,且保證是字串S
裡的字元。S
和C
中的所有字母均為小寫字母。
【思路】該題可以分情況討論:
情況一:被計算長度的那個字元只有一邊有給定的字元C,即開頭和結尾;
情況二:被計算長度的那個字元夾在兩個C字元中間。
class Solution { public: vector<int> shortestToChar(string S, char C) { vector<int> ret(S.size()); int fpos = S.find(C, 0);//第一個C的位置 int i;//記錄位置 for (i = 0; i <= fpos; i++) { ret[i] = fpos - i; } //i++; while (S[i] != '\0') { int pos = S.find(C, i); if (pos == -1)//最後沒有C字元了 { for (int k = 0; k < S.size() - i; k++) { ret[i + k] = k + 1; } break; } else//找到下一個C字元 { if ((pos - i) % 2 == 0)//相同C字元之間為偶數個字元 { for (int j = 0; j < (pos - i) / 2; j++) { ret[i + j] = j + 1; ret[pos - j - 1] = j + 1; } } else////相同C字元之間為奇數個字元 { for (int j = 0; j < (pos - i) / 2; j++) { ret[i + j] = j + 1; ret[pos - j - 1] = j + 1; } ret[i + (pos - i) / 2] = (pos - i) / 2 + 1; } } i += pos - i + 1;//移動到C的下一個字元 } return ret; } };