回文子串查找

本文介绍了一种寻找字符串中所有回文子串的高效算法——中心拓展法。该算法利用回文的特性,从中心位置向两侧扩展,判断左右字符是否相等,从而快速找出所有回文子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查找回文子串

中心拓展法

中心拓展法是根据回文的特点,因为回文顺着读和反过来读是一摸一样的,所有可以理解为左半边和右半边是一模一样的,可以通过中心位置确定两边的字符是否相等,类似一个洋葱,但是不是从外往外边剥,而是从里往外剥。具体算法如下:

var countSubstrings = function(s) {  
  let len = s.length;    
  if (len < 2) return len;// 一个字符只有一个回文,就不用去使用中心查找法了  
  let result = 0; 
  const centerSpread = function (str, left, right) {    
   // 每一次l和r都是一样的。在首次的时候一个字符串他是一个回文,所有      
  // l向左边拓展,r向右边拓展,判断拓展后的字符是否相等,相等则这两个字符加上中心字符就是回文了。 
 // 如果不相等,就不是回文了,不用继续拓展了。直接返回就可以了。          
  let len = str.length;       
   let i = left;     
        let j = right;   
     while (i >= 0 && j < len) {         
     if (str.charAt(i) === str.charAt(j)) {        
             result++;         
               i--;        
              j++;         
                  } else {         
                     break;        
               }        }    };    
 for (let i = 0; i < len; i++) {       
     centerSpread(s, i, i);// 中心拓展法查找回文中心为一个字符的情况  
   centerSpread(s, i, i + 1);// 判断相邻的两个字符是不是回文,中心为两个字符的情况    }   
 return result;};
### 双回文子串与普通回文子串的区别 在计算机科学中,普通回文子串是指字符串中的某一部分能够满足从左到右读取和从右到左读取完全相同的特点[^1]。 对于双回文子串而言,在现有资料中并没有直接定义该术语。然而,基于上下文中提到的不同类型的回文字串处理方法,推测所谓的“双回文子串”可能指涉及两种不同形式或条件下的回文检测方式: - **中心扩展法**:适用于寻找任意位置作为潜在中心点向外扩散来查找最长回文的情况;这包括奇数长度(单字符为中心)以及偶数长度(一对相等字符为中心)。这种方法可以通过设定两个索引来实现,既可以指向同一位置表示奇数长度的子串,也可以指向相邻的位置表示偶数长度的子串[^5]。 - **动态规划法或其他算法变体**:用于解决更复杂场景下如允许删除一个字符后的有效回文判断等问题[^2]。 因此,“双回文子串”的概念可能是为了区分标准意义上的单一模式回文与其他特定条件下形成的复合型或多态性的回文结构。具体应用取决于实际编程挑战的要求。 ```python def expand_around_center(s, left, right): L, R = left, right while L >= 0 and R < len(s) and s[L] == s[R]: L -= 1 R += 1 return s[L+1 : R] # Example usage for both odd and even length substrings print(expand_around_center("babad", 1, 1)) # Odd-length palindrome "bab" print(expand_around_center("cbbd", 1, 2)) # Even-length palindrome "bb" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值