数据结构和算法--字符串

想要研究字符串的数据结构和算法,可以先看一遍字符串自带的一些的属性和方法

557.反转字符串中的单词 III

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例:

输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

提示:

  • 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

思路1:

  1. 将字符串用空格分隔成数组
  2. 将数组内的字符串反转

代码1:

var reverseWords = function(s) {
    return s.split(' ').map(item => {
        return item.split('').reverse().join('')
    }).join(' ')
};

思路2:

  1. 将字符串按每个字符分隔成数组
  2. 将数组内的字符串反转后再拼接成字符串
  3. 将拼接成的字符串再按空格分隔成数组
  4. 然后将数组内的字符串反转后再拼接成字符串

代码2:

var string="Let's take LeetCode contest";
function reverseBySeparator(string, separator) {
  return string.split(separator).reverse().join(separator);
}
var reverseEntireSentence = reverseBySeparator(string, "");// "tsetnoc edoCteeL ekat s'teL"
 reverseBySeparator(reverseEntireSentence, " ");// "s'teL ekat edoCteeL tsetnoc"
  • 统计一个字符串出现最多的字母

思路:

  1. 统计每个字母出现的次数,存起来
  2. 然后进行比较

代码:

function maxTimesChar(str) {  
  if(str.length == 1) {
    return str;
  }
  let charObj = {};
  for(let i=0;i<str.length;i++) {
    if(!charObj[str.charAt(i)]) {
      charObj[str.charAt(i)] = 1;
    }else{
      charObj[str.charAt(i)] += 1;
    }
  }
  let maxChar = '',
      maxValue = 1;
  for(var k in charObj) {
    if(charObj[k] >= maxValue) {
      maxChar = k;
      maxValue = charObj[k];
    }
  }
  return maxChar;

}
  • 判断一个单词是否是回文

思路:

  1. 利用reverse 进行字符串反转
  2. 然后和原字符串对比是否相等

代码:

function isPalindrom(str) {  
    return str == str.split('').reverse().join('');
}
  • 乱序同字母字符串
    给定两个字符串,判断是否颠倒字母而成的字符串,譬如Mary与Army就是同字母而顺序颠倒

思路:

  1. 将两个字符串全部转换成小写或大写字符串
  2. 然后将每个字符串按每个字符分隔成数组,排序再拼接成字符串
  3. 最后对比拼接成的字符串是否相等

代码:

var firstWord = "Mary";
var secondWord = "Army";
 
isAnagram(firstWord, secondWord); // true
 
function isAnagram(first, second) {
  // For case insensitivity, change both words to lowercase.
  var a = first.toLowerCase();
  var b = second.toLowerCase();
 
  // Sort the strings, and join the resulting array to a string. Compare the results
  a = a.split("").sort().join("");
  b = b.split("").sort().join("");
 
  return a === b;
}
  • 判断大括号是否闭合

思路:

  1. 循环判断如果是左大括号就放到一个定义的数组中
  2. 如果是右大括号再接着判断上面定义的数组是否有值
  3. 如果有值就从尾部把定义的数组移除掉一个值
  4. 如果没值就直接返回false
  5. 最后如果定义的数组有值就返回false,否则返回true

代码:

function isBalanced(expression) {
  var checkString = expression;
  var stack = [];
 
  for (var i = 0; i < checkString.length; i++) {debugger
    if(checkString[i] === '{') {
      stack.push(checkString[i]);
    } else if (checkString[i] === '}') {
      // Pop on an empty array is undefined
      if (stack.length > 0) {
        stack.pop();
      }else{
        return false;
      }
    }
  }
 
  // If the array is not empty, it is not balanced
  if (stack.length) return false;
  return true;
}
  • 随机生成指定长度的字符串

思路:

  1. 把所有可能的字符定义成一个字符串
  2. 循环该指定长度的次数
  3. 获取所有有可能的字符长度的随机字符
  4. 把上属获取的随机字符取整
  5. 然后从所有有可能的字符串中把上属整数位的值取出来
  6. 最后循环的把第五步取出来的字符加在一起返回

代码:

function randomString(n) {  
  let str = 'abcdefghijklmnopqrstuvwxyz9876543210';
  let tmp = '',
      i = 0,
      l = str.length;
  for (i = 0; i < n; i++) {
    tmp += str.charAt(Math.floor(Math.random() * l));
  }
  return tmp;
}
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页