JSアルゴリズムの文字列記事(多くの基本操作)

添え字が存在しない場合、str [index]とstr.charAt(index)の違いは次のとおりです。

  • str [index]は未定義を返します

  • str.charAt(index)は ""(空の文字列)を返します

leetcode14:最長の共通プレフィックス

空の配列の存在に注意してください。最長の共通プレフィックスが判断されるため、適切な位置でループを終了する必要があります。ここでは、配列のevery()メソッドを使用して、配列要素に共通の要素があるかどうかを判断します。

var longestCommonPrefix = function(strs) {
    
    
    let res = '';
    if(!strs.length) return res;
    for(let i=0 ;i<strs[0].length;i++){
    
    
        let flag = strs.every(item => item[i]==strs[0][i]);
        if(flag){
    
    
            res+=strs[0][i];
        }else{
    
    
            break;
        }
    }
    
    return res;
};

leetcode415:文字列の追加

さまざまな方法にできるだけ慣れるために、書き込みは少し長くなります。

まず、ゼロフィル操作のストリングの長さを判断します。次に、後ろから前に数字を追加し、キャリーを制御し、文字列を連結し、最後に反転して結果を取得します。

var addStrings = function(num1, num2) {
    
    
    if(num1.length > num2.length){
    
    
        [num1,num2] = [num2,num1];     //用到js的解构来进行数值调换很方便。
    }
    let l1 = num1.length;
    let l2 = num2.length;
    let num = new Array(l2-l1).fill(0).join('');   //根据差的位数来补零
    num1 = num + num1; 
    let f = 0;
    let res = ""
    for(let i = l2-1;i>=0;i--){
    
    
        if(Number(num1[i])+Number(num2[i])+f>=10){
    
    
            res+=String(Number(num1[i])+f+Number(num2[i])-10);
            f=1;
        }else{
    
    
            res+=String(Number(num1[i])+Number(num2[i])+f);
            f=0;
        }
    }
    if(f==1){
    
    
        res+='1';
    }
    res = res.split('').reverse().join('');  //字符串取反的基操
    return res;
};

Baidu:入力が回文文字列であるかどうかを判別する関数を実装します

回文文字列」は肯定的な読みであり、破語は同じ文字列です

APIを使用する

function isPlalindrome(str) {
    
    
  return str.split('').reverse().join('') === str;
}

APIなし

function isPlalindrome(str) {
    
    
  let l = 0;
  let r = str.length-1;
  while(l<r){
    
    
      if(str.charAt(l) !== str.charAt(r)) return false;
      l++;r--;
  }
    return true;
}

leetcode3:文字列が繰り返されていない最長の部分文字列

解決策1:

古典的な動的計画法動的計画法であるため、それぞれの状態を明確に考える必要があります。dp配列は現在のi番目の文字の前に繰り返されない最長の部分文字列長さを記録します。

1)現在の文字が初めて表示される場合、dp [i] = dp [i-1] + 1;

2)現在のキャラクターが初めて表示されない場合、次の2つの状況があります。

  • 現在の文字が最後に出現するのは、dp [i-1]に含まれる文字列の外側です。l = dp [i-1] + 1
  • 現在の文字が最後に出現するのは、dp [i-1] l = i-s.lastIndexOf(s [i]、i-1)に含まれる文字列内です。

これらの2つのケースでは、最小の長さのみを選択できます。

var lengthOfLongestSubstring = function(s) {
    
    
    if(!s.length) return 0;
    if(s.length == 1) return 1;
    let dp = new Array(s.length).fill(1);   //初始化所有dp为1
    let res = 0;
    for(let i=1; i<s.length;i++){
    
    
        if(s.indexOf(s[i]) == i){
    
    
            dp[i] = dp[i-1]+1;
        }else{
    
    
            dp[i] =Math.min(i - s.lastIndexOf(s[i],i-1),dp[i-1]+1);
        }
        res = Math.max(res,dp[i]);
    }
    return res
};

**ソリューション2:**スライディングウィンドウ

現在のキャラクターがウィンドウに表示されているかどうかを判断することで、ウィンドウの開始点を変更する必要があるかどうかを判断できます。

var lengthOfLongestSubstring = function(s) {
    
    
    let res = [];
    let ans = 0,start = 0;
    for(let i=0; i<s.length; i++){
    
    
        let p = s.indexOf(s.charAt(i),start);
        if( p < i){
    
    
            start = p + 1;
        }
        ans = Math.max(i-start+1,ans);
    }
    return ans;
};

leetcode151:文字列内の単語を逆にする

ここで複数のスペースを処理する場合、split( '')は複数の空の文字列を配列に割り当てます。これには、追加の判断が必要です。

var reverseWords = function(s) {
    
    
    return s.split(' ').reverse().reduce((pre,cur) => {
    
    
        if(cur.length){
    
    
            return pre+cur+' '
        }else{
    
    
            return pre
        }
    },'').trim();

};

事前に複数のスペースを処理する

let reverseWords = (s)=> {
    
    
  return s.trim().replace(/\s+/g, ' ').split(' ').reverse().join(' ')
}
var reverseWords = function(s) {
    
    
    return s.split(/\s+/g).reverse().join(' ').trim()
};

おすすめ

転載: blog.csdn.net/Pinoochio/article/details/113622713