IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2022-010ARTS -> 正文阅读

[数据结构与算法]2022-010ARTS

ARTS:Algorithm、Review、Tip、Share

  • Algorithm 算法题
  • Review 英文文章
  • Tip 回想一下本周工作中学到的一个小技巧
  • Share思考一个技术观点、社会热点、一个产品或是一个困惑

Algorithm

练习:最长回文子串

manacher算法是解决最长回文子串的经典算法,如果使用暴力算法求解,时间复杂度为O(n^2),而manacher算法能够将时间复杂度优化为O(n)。

首先,为了解决奇偶数不同情况下回文字符串的识别,通过在每个字符前后添加特殊符号来分隔实现统一处理。其次准备一个pArray数组来保存每个字符对应的最长回文子串的大小,最小也就是为1。额外两个有用的变量

  • 用R标记当前达到的最大右边界;
  • 最大右边界对应的回文字符串重点位置C;

遍历参数字符串中每个字符,分情况处理:

  • i在R外(只可能是右侧):暴力去识别回文结构,识别完后,更新R、C
  • i在R内,此时又分为3种情况:
    • i 根据C在其左侧对应的 i’ 已经求结果,对应的回文结构完全在L…R内(L是对应R左侧的位置),i 的最长回文子串大小此时直接为pArray(i’);
    • i’ 的回文子串左侧在L外,此时i的最长回文子串大小为R-i;
    • i’ 的回文子串左侧正好在L处,此时i的最长回文子串大小至少为R-i,还需要再继续右扩继续识别。

编码实现

public static int manacher(String s) {
    if (s == null || s.isEmpty()) {
        return 0;
    }
    char[] str = manacherString(s);
    int[] pArr = new int[str.length];
    int C = -1;
    int R = -1;
    int max = Integer.MIN_VALUE;
    for (int i = 0; i < str.length; i++) {


        pArr[i] = i < R ? Math.min(pArr[2 * C - i], R - i) : 1;
        while (i + pArr[i] < str.length && i - pArr[i] > -1) {
            if (str[i + pArr[i]] == str[i - pArr[i]]) {
                pArr[i]++;
            } else {
                break;
            }
        }


        if (i + pArr[i] > R) {
            R = i + pArr[i];
            C = i;
        }
        max = Math.max(pArr[i], max);
    }
    return max - 1;
}

public static char[] manacherString(String str) {
    char[] charArr = str.toCharArray();
    char[] res = new char[str.length() * 2 + 1];
    int index = 0;
    for (int i = 0; i != res.length; i++) {
        res[i] = (i & 1) == 0 ? '#' : charArr[index++];
    }
    return res;
}

复杂度分析

R的处理不断向右,时间复杂度为O(n)。

Review

DecimalFormat Is Not Thread Safe

Tip

最近在看项目中的代码,计算金额的部分用到了BigDecimal、DecimalFormat 类,并且直接定义DecimalFormat为了类的静态成员变量类型,在多个线程之间公用,看了下DecimalFormat的注释,明确说明了这个类并不是线程安全的,那能不能这么直接使用呢?翻看了一些资料,介绍一般都是避免在线程间共享使用的,如果为了复用对象,最好是使用ThreadLocal包一层。

也没翻到一些具体怎么复现出问题的情况,由于我们只用到了format方法,自己模拟了一下并发的情况,并没有什么问题,但对于这种情况JDK是并不能保证未来的版本不会出问题的,所以我认为还是应该在多线程共享的情况下小心使用。

最近感触:做好工作,但不能只局限于工作的琐碎,在工作中成长、提高,善于发现问题,更善于解决问题;

Share

看了几篇吴军老师的文章,对生活中的无常、无奈有了些感受,也更多的思考自己生活的节奏,过去总是过的那么匆忙,却总是忘了让自己经常停下来放慢一些节奏。工作上可能要求我们快速处理,但生活上、个人的思考上,我想更适合慢一些的节奏吧。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:36:03  更:2022-04-04 12:37:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:55:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码