Guest User

Untitled

a guest
Dec 16th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. class Solution {
  2. public:
  3. int strongPasswordChecker(string s) {
  4. //toReplace represent number of replace we can do to suffice case 3
  5. int len = s.size(), needLower = 1, needUpper = 1, needNum = 1, left = 0, toReplace = 0;
  6. //let say subLen is length of repeating chars with length more than 2
  7. //toReplace only depends on subLen / 3
  8. //So we use map to count subLen % 3 == 0, subLen % 3 == 1 and subLen % 3 == 2
  9. //when deleteing, we delete from subLen % 3 == 0 since it can reduce toReplace by deleting least characters
  10. vector<unordered_map<int, int>> counts(3);
  11. for(int i = 0; i <= len; ++i)
  12. {
  13. char c = s[i];
  14. if(islower(c))needLower = 0;
  15. if(isupper(c))needUpper = 0;
  16. if(isdigit(c))needNum = 0;
  17.  
  18. if(i >= len || c != s[left])
  19. {
  20. int subLen = i - left;
  21. if(subLen >= 3)
  22. {
  23. ++counts[subLen % 3][subLen];
  24. toReplace += subLen / 3;
  25. }
  26. left = i;
  27. }
  28. }
  29.  
  30. if(len < 6)return max(6 - len, needUpper + needLower + needNum);
  31. else if(len <= 20)return max(toReplace, needUpper + needLower + needNum);
  32. else
  33. {
  34. //delete first, then replace
  35. int toDelete = len - 20, totalDeleted = toDelete;
  36. toReplace = 0;
  37. for(int i = 0; i < 3; ++i)
  38. {
  39. //first check deleting 1 char
  40. //then check deleting 2 and deleting 3
  41. for(auto&& p : counts[i])
  42. {
  43. if(i < 2)
  44. {
  45. int canDelete = min(p.second, toDelete / (i + 1));
  46. toDelete -= canDelete * (i + 1);
  47. p.second -= canDelete;
  48. //now three will be only len % 3 == 2
  49. if(p.first - (i + 1) > 2)counts[2][p.first - (i + 1)] += canDelete;
  50. }
  51. //now we have all repeating substring with len % 3 == 2, counting it
  52. toReplace += p.second * (p.first / 3);
  53. }
  54. }
  55. //if we have more char can delete, delete to reduce toReplace
  56. toReplace -= (toDelete / 3);
  57. return totalDeleted + max(toReplace, needUpper + needLower + needNum);
  58. }
  59. }
  60. };
Add Comment
Please, Sign In to add comment