arrays.binarysearch 本身不支持前缀匹配,但可通过插入点逻辑高效判断字符串是否为已排序词典中的单词或前缀;返回≥0表示存在完整单词,返回负值时插入点为(-返回值)-1,需检查该位置及前一位置元素是否以查询串开头,要求数组升序、大小写统一、无null。

Arrays.binarySearch 本身不直接支持“前缀匹配”,但它可以配合插入点逻辑,高效判断一个字符串是否为已排序词典中的单词或前缀。这种用法常见于拼写检查、自动补全、字典树模拟等场景。
核心原理:利用插入点定位潜在前缀位置
binarySearch 返回负值时,实际隐含了该字符串在有序数组中“应插入的位置”。这个位置前后的元素,就是唯一可能与查询字符串构成前缀关系的候选项。
- 若返回值 ≥ 0 → 字符串存在,是完整单词
- 若返回值为负(如 -5)→ 插入点 = (-返回值) - 1 = 4,即它应插在索引 4 处
- 此时只需检查索引 4 处的单词(如果存在)是否以查询字符串开头;有时还需检查索引 3 处的单词(紧邻前一个),尤其当插入点为 0 时无前驱,插入点为数组长度时无后继
典型应用场景:词典中判别 WORD / PREFIX / NOT_WORD
假设有一个升序排列的单词数组:["apple", "application", "banana", "cat"]
- 查
"app":binarySearch 返回负值(比如 -2),插入点 = 1 → 检查索引 1 的"application"→"application".startsWith("app")为 true → 是前缀 - 查
"appl":插入点同样可能是 1 →"application".startsWith("appl")仍为 true - 查
"apx":插入点为 1 →"application".startsWith("apx")为 false,且索引 0 的"apple"也不以 "apx" 开头 → 不是单词,也不是前缀 - 查
"apple":返回 0 → 直接判定为 WORD
关键代码修正点(避免常见错误)
原始代码中计算 checkIndex = (wordIndex * -1) + 1 是错的。正确插入点公式是:insertionPoint = (-wordIndex) - 1。
- 例如返回 -137 → 插入点 = 136,不是 137
- 应检查
myWordsArray[insertionPoint](如果 insertionPoint - 为严谨起见,也建议检查
myWordsArray[insertionPoint - 1](如果 insertionPoint > 0),因为前缀可能落在前一个词上(比如查 "ban",插入点是 "banana" 的索引,但 "ban" 实际是它的前缀;而查 "baa",插入点相同,但前一个词是 "apple",不匹配) - 注意大小写统一处理(如都转小写再比较),否则
startsWith可能失效
实际使用前提与注意事项
这套方案能跑通,依赖几个硬性条件:
- 单词数组必须严格按字典序升序排列(可用
Arrays.sort(words)保证) - 所有单词和查询字符串需采用一致的大小写策略(推荐全部转小写比较)
- 不能有 null 元素,否则
startsWith会抛 NullPointerException - 时间复杂度仍是 O(log n) 查找 + O(1) 字符串前缀判断,整体高效











