TypeScript字符串处理实战用slice、substring和replace解决5个高频算法题字符串处理是算法面试中的常客也是TypeScript开发者必须掌握的核心技能。不同于单纯记忆API用法真正的挑战在于如何将这些基础方法组合运用解决实际问题。本文将手把手带你用slice、substring和replace三大核心API破解5道高频算法题。1. 反转字符串巧用slice的负索引反转字符串是入门级的算法题但解法却能体现对字符串API的理解深度。先看题目要求给定字符串algorithm输出反转后的结果mhtirogla传统思路可能会用循环逆序拼接但TypeScript的slice配合负索引可以更优雅地实现function reverseString(str: string): string { return str.split().reverse().join(); }不过这种方法需要创建数组内存效率不高。更优解是利用slice的负索引特性function reverseString(str: string): string { let result ; for (let i str.length - 1; i 0; i--) { result str.slice(i, i 1); } return result; }性能对比方法时间复杂度空间复杂度数组反转O(n)O(n)slice拼接O(n)O(1)2. 回文判断substring的对称切割判断回文字符串时substring的区间切割能力大显身手。题目示例输入racecar返回true输入typescript返回false关键点在于比较首尾对称字符。substring比slice更适合这种精确位置切割function isPalindrome(str: string): boolean { const mid Math.floor(str.length / 2); for (let i 0; i mid; i) { const left str.substring(i, i 1); const right str.substring(str.length - 1 - i, str.length - i); if (left ! right) return false; } return true; }优化技巧提前终止发现不匹配立即返回忽略大小写先统一转小写str.toLowerCase()去除非字母数字配合replace(/[^a-z0-9]/g, )3. 字符串压缩replace的正则威力字符串压缩是LeetCode第443题要求统计连续相同字符个数。例如输入aaabbbcc输出a3b3c2replace配合正则表达式能简洁地处理这种模式替换function compressString(str: string): string { return str.replace(/([a-z])\1*/g, (match, p1) { return p1 (match.length 1 ? match.length : ); }); }正则分解([a-z])捕获单个字母\1*匹配后续相同字符回调函数拼接字符和出现次数边界情况处理输入预期输出处理逻辑aa长度1时不添加数字aaa2长度1时添加计数aaba2b混合情况分段处理4. 模板替换replace的进阶用法实际开发中常需要处理模板字符串替换。例如将Hello {name}中的{name}替换为TypeScriptreplace的回调函数形式可以支持复杂替换逻辑function renderTemplate(template: string, data: Recordstring, string): string { return template.replace(/\{(\w)\}/g, (match, key) { return data[key] || match; }); } // 使用示例 const result renderTemplate(Hello {name}, { name: TypeScript }); console.log(result); // 输出Hello TypeScript扩展功能嵌套对象支持user.name格式默认值未匹配时返回预设值过滤器添加|upper等格式处理5. 最长公共前缀substring的渐进裁剪LeetCode第14题要求找出字符串数组的最长公共前缀。例如输入[flower,flow,flight]输出flsubstring的精确裁剪特性非常适合这种渐进式比较function longestCommonPrefix(strs: string[]): string { if (strs.length 0) return ; let prefix strs[0]; for (let i 1; i strs.length; i) { while (strs[i].indexOf(prefix) ! 0) { prefix prefix.substring(0, prefix.length - 1); if (prefix ) return ; } } return prefix; }算法步骤取第一个字符串为初始前缀遍历后续字符串用indexOf检查前缀匹配不匹配时用substring缩短前缀前缀为空时立即返回复杂度分析时间复杂度O(S)S为所有字符串字符总数空间复杂度O(1)只使用常数额外空间实战技巧与性能考量在真实面试场景中除了写出正确解法还需要关注代码效率。以下是几个优化方向1. 避免不必要的字符串操作// 不推荐频繁创建新字符串 let result ; for (const char of str) { result char; // 每次拼接都创建新字符串 } // 推荐使用数组暂存 const arr []; for (const char of str) { arr.push(char); } return arr.join();2. 善用API的特性差异方法负参数处理性能适用场景slice支持一般需要负索引时substring自动调整较快精确位置切割substr已废弃慢不推荐使用3. 正则表达式的预编译// 高频使用时预编译正则 const templateRegex /\{(\w)\}/g; function render(template: string) { return template.replace(templateRegex, ...); }在最近的TypeScript 5.0中字符串处理性能有显著提升。特别是在大型字符串操作时引擎优化使得slice和substring的差异变得更小但算法题中通常字符串长度有限选择最语义化的API更重要。