93. 复原 IP 地址

对一个字符串加入

  1. /**
  2. * @param {string} s
  3. * @return {string[]}
  4. */
  5. var restoreIpAddresses = function(s) {
  6. let n = s.length;
  7. if (n <= 3) {
  8. return [];
  9. }
  10. let ans = [];
  11. function dfs(path, start) {
  12. if (path.length === 4) { // 结束条件要仔细看
  13. if (start === n) {
  14. ans.push(path.join('.'));
  15. }
  16. return;
  17. }
  18. for (let i = 1; i <= 3; i++) {
  19. let cur = s.slice(start, start + i); // slice(start, length) 这样去记录
  20. if (/^0/.test(cur) && cur.length > 1) {
  21. break;
  22. }
  23. cur = Number(cur);
  24. if (cur > 255) {
  25. break;
  26. }
  27. dfs([...path, cur], start + i);
  28. }
  29. }
  30. dfs([], 0); // 这类题目,dfs path 是必传
  31. return ans;
  32. };

很类似的题目,但是使用的是动态规划:

  1. var numDecodings = function(s) { // 动态规划,没有要求具体的例子,只是要数目
  2. let n = s.length;
  3. if (n === 0) {
  4. return 0;
  5. }
  6. let dp = new Array(n + 1).fill(0);
  7. dp[0] = 1;
  8. for (let i = 1; i < n + 1; i++) {
  9. if (s[i - 1] !== '0') {
  10. dp[i] = dp[i - 1];
  11. }
  12. let cur = s.slice(i - 2, i);
  13. if (Number(cur) <= 26 && (s[i - 2] !== '0') && i >= 2) {
  14. dp[i] += dp[i - 2]
  15. }
  16. }
  17. return dp[n];
  18. };

也可以使用递归的手段,但是效率太低:

  1. var numDecodings = function(s) {
  2. let n = s.length;
  3. let count = 0;
  4. function dfs(path, start) {
  5. let way = path.slice(path.lastIndexOf('.') + 1); // 注意寻找
  6. if (way[0] === '0') {
  7. return;
  8. } else if (way.length >= 3) {
  9. return;
  10. } else if (Number(way) > 26) {
  11. return;
  12. }
  13. if (start >= n) {
  14. count++;
  15. return;
  16. }
  17. dfs(path + '.' + s[start], start + 1);
  18. dfs(path + s[start], start + 1);
  19. }
  20. dfs('', 0)
  21. return count / 2;
  22. };

131. 分割回文串

还是一样的套路。

  1. var partition = function(s) {
  2. function isHuiWen(str) {
  3. return str === str.split('').reverse().join('');
  4. }
  5. let n = s.length;
  6. let ans = new Set();
  7. function dfs(path, start) {
  8. if (start >= n) {
  9. ans.add(path.join(','));
  10. return;
  11. }
  12. for (let i = 1; i <= n; i++) {
  13. let cur = s.slice(start, start + i);
  14. if (isHuiWen(cur)) {
  15. dfs([...path, cur], start + i);
  16. } else {
  17. continue;
  18. }
  19. }
  20. }
  21. dfs([], 0);
  22. return Array.from(ans).map(item => item.split(','));
  23. };

但是时间很长。

jerray ai 的考题:

题目:给字符串 ‘123456789’,在其中添加‘+-’,使得
image.png
之和为100。

  1. function dfs(path, start) {
  2. if (start === 10) {
  3. if (eval(path) === 100) {
  4. console.log(path);
  5. }
  6. return;
  7. }
  8. dfs(path + '+' + start, start + 1);
  9. dfs(path + '-' + start, start + 1);
  10. dfs(path + '' + start, start + 1);
  11. }
  12. dfs('', 1);