336. 回文对

简介: 解题思路原始字符串放入hash表找前缀找后缀所以前缀是回文的情况都试-遍,后缀是回文的情况都试一遍边界整体是回文的情况前后拼空字符串

文章目录

前言

解题思路

边界

代码

前言

给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。


示例 1:


输入:words = [“abcd”,“dcba”,“lls”,“s”,“sssll”]

输出:[[0,1],[1,0],[3,2],[2,4]]

解释:可拼接成的回文串为 [“dcbaabcd”,“abcddcba”,“slls”,“llssssll”]


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/palindrome-pairs

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题思路

原始字符串放入hash表


找前缀


找后缀

所以前缀是回文的情况都试-遍,后缀是回文的情况都试一遍




边界

整体是回文的情况前后拼空字符串


自己的逆序


代码

class Solution {

   public static List<List<Integer>> palindromePairs(String[] words) {

 HashMap<String, Integer> wordset = new HashMap<>();

 for (int i = 0; i < words.length; i++) {

  wordset.put(words[i], i);

 }

 List<List<Integer>> res = new ArrayList<>();

 //{ [6,23] 、 [7,13] }

 for (int i = 0; i < words.length; i++) {

  // i words[i]

  // findAll(字符串,在i位置,wordset) 返回所有生成的结果返回

  res.addAll(findAll(words[i], i, wordset));

 }

 return res;

}


public static List<List<Integer>> findAll(String word, int index, HashMap<String, Integer> words) {

 List<List<Integer>> res = new ArrayList<>();

 String reverse = reverse(word);

 Integer rest = words.get("");

 if (rest != null && rest != index && word.equals(reverse)) {

  addRecord(res, rest, index);

  addRecord(res, index, rest);

 }

 int[] rs = manacherss(word);

 int mid = rs.length >> 1;

 for (int i = 1; i < mid; i++) {

  if (i - rs[i] == -1) {

   rest = words.get(reverse.substring(0, mid - i));

   if (rest != null && rest != index) {

    addRecord(res, rest, index);

   }

  }

 }

 for (int i = mid + 1; i < rs.length; i++) {

  if (i + rs[i] == rs.length) {

   rest = words.get(reverse.substring((mid << 1) - i));

   if (rest != null && rest != index) {

    addRecord(res, index, rest);

   }

  }

 }

 return res;

}


public static void addRecord(List<List<Integer>> res, int left, int right) {

 List<Integer> newr = new ArrayList<>();

 newr.add(left);

 newr.add(right);

 res.add(newr);

}


public static int[] manacherss(String word) {

 char[] mchs = manachercs(word);

 int[] rs = new int[mchs.length];

 int center = -1;

 int pr = -1;

 for (int i = 0; i != mchs.length; i++) {

  rs[i] = pr > i ? Math.min(rs[(center << 1) - i], pr - i) : 1;

  while (i + rs[i] < mchs.length && i - rs[i] > -1) {

   if (mchs[i + rs[i]] != mchs[i - rs[i]]) {

    break;

   }

   rs[i]++;

  }

  if (i + rs[i] > pr) {

   pr = i + rs[i];

   center = i;

  }

 }

 return rs;

}


public static char[] manachercs(String word) {

 char[] chs = word.toCharArray();

 char[] mchs = new char[chs.length * 2 + 1];

 int index = 0;

 for (int i = 0; i != mchs.length; i++) {

  mchs[i] = (i & 1) == 0 ? '#' : chs[index++];

 }

 return mchs;

}


public static String reverse(String str) {

 char[] chs = str.toCharArray();

 int l = 0;

 int r = chs.length - 1;

 while (l < r) {

  char tmp = chs[l];

  chs[l++] = chs[r];

  chs[r--] = tmp;

 }

 return String.valueOf(chs);

}

}


目录
相关文章
|
9月前
|
数据采集 人工智能
LLM2LLM:LLM2LLM:用 LLM 来增强 LLM !通过教师模型合成数据,增强学生模型的训练数据集
LLM2LLM 是一种创新的迭代数据增强技术,通过教师模型生成合成数据,显著提升大语言模型在数据稀缺任务中的性能。
480 90
LLM2LLM:LLM2LLM:用 LLM 来增强 LLM !通过教师模型合成数据,增强学生模型的训练数据集
|
11月前
|
边缘计算 自动驾驶 物联网
探索云计算的边缘计算:定义、优势及应用前景
探索云计算的边缘计算:定义、优势及应用前景
|
9月前
|
人工智能 数据可视化 数据库
低代码平台:技术复杂性的系统简化
低代码平台通过模块化和自动化技术,简化了传统开发流程中的需求分析、代码开发、测试部署等环节,显著提高了开发效率和协作效率。其核心特性如“一键编程”、“快速迭代”降低了开发复杂度,并提供敏捷开发能力,使企业能够更快速响应市场需求和技术变革。可视化开发技术实现了高效的应用构建,组件化设计、实时渲染与动态预览、分布式协作支持以及无缝部署等功能进一步提升了开发体验。同时,平台在SQL引擎、功能引擎、模板引擎、图表引擎和切面引擎等方面进行了系统性优化,增强了数据处理能力和智能化水平,满足复杂业务需求。插件生态覆盖多行业场景,提供了灵活的扩展能力,帮助企业实现从开发工具到决策支持的全方位功能模块。
|
9月前
|
安全 Cloud Native Linux
龙蜥社区漏洞管理治理策略与实践
本次分享的主题是龙蜥社区漏洞管理治理策略与实践,由阿里云龙蜥社区漏洞管理的张世乐分享。主要分为四个部分: 1.龙蜥社区 2.龙蜥操作系统 3.针对漏洞的治理策略
170 3
|
9月前
|
人工智能 算法 搜索推荐
《开源算法:人工智能领域的双刃剑》
在人工智能蓬勃发展的今天,开源算法作为重要支撑,显著促进了算法创新、模型开发、技术进步与知识共享,并节省了时间与计算资源,降低了企业开发成本。然而,它也存在数据隐私与安全、个性化服务、创新速度、技术支持与维护及许可证与法律等方面的局限性。实际应用中需权衡优劣,选择合适方案以实现最大价值。
247 10
|
9月前
|
人工智能 前端开发 算法
科技云报到:从大模型到云端,“AI+云计算”还能讲出什么新故事
科技云报到:从大模型到云端,“AI+云计算”还能讲出什么新故事
250 3
|
11月前
|
机器学习/深度学习 存储 人工智能
人工智能的伦理困境与挑战
在本文中,我们将探讨人工智能技术的快速发展所带来的一系列伦理问题和挑战。随着AI技术的不断进步和应用范围的扩大,如何确保其发展符合道德标准、保护个人隐私以及避免潜在的社会不公成为了亟待解决的问题。本文旨在通过分析当前AI领域面临的主要伦理困境,并提出可能的解决方案或缓解措施,以促进更加负责任地使用和发展人工智能技术。
1039 1
|
数据采集 安全 搜索推荐
更高性价比的住宅IP代理服务商SmartProxy
互联网的发展增加了对海外住宅IP的需求。它们为个人提供访问特定区域资源的能力,并为企业拓展国际市场提供支持。选择可靠的供应商至关重要; SmartProxy作为优质服务商,特点包括: - 覆盖200多个国家的真实住宅IP。 - 高匿性及无限带宽确保数据采集无忧。 - 支持多种协议并可定制独享IP。 - 自定义选项实现精准定位。 - 24/7技术支持保障使用体验。 静态住宅IP提供固定地址,适用于需稳定连接的场景。[了解更多](https://www.smartproxycn.com/?r-source=-8jaZawMss)并领取0.5G免费流量。
|
API 数据格式
初识SSE
初识SSE
277 0
|
人工智能 安全 API
门禁系统的人脸识别功能是如何实现的
在人工智能不断发展的今天,很多事情都迈向了智能化,以我们的门禁为例,经过了物理钥匙、门卡、密码、指纹迭代,已经进入了人脸识别的时代。人脸识别门禁机也已经在小区、医院、学校、写字楼、工厂等场所普及开来。只需一两秒的识别,门禁系统就会根据比对结果进行操作,特别是在疫情期间,人脸识别门禁系统以其非接触的优点,在保障大家工作生活方面发挥了不小的作用。
884 0
门禁系统的人脸识别功能是如何实现的