首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >理解字符串算法中的“查找最大出现字符”

理解字符串算法中的“查找最大出现字符”
EN

Stack Overflow用户
提问于 2020-12-07 02:59:52
回答 2查看 403关注 0票数 3

我正在学习数据结构和算法,我有一个小问题,就是如何理解在字符串中发现哪一个字符最多的过程。

我理解总体目标--拥有一个表示特定字符计数的数组,我显然了解如何在数组中找到max,但我对这一堆代码(来自https://www.geeksforgeeks.org/return-maximum-occurring-character-in-the-input-string/的代码)有很大的问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        int count[] = new int[256]; 

          for (int i=0; i<str.length(); i++) 
            count[str.charAt(i)]++; <-- what I don't understand

我正在初始化count数组以保存in,但是在for循环中搜索字符串中的特定字符,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
count["t"]++

所以它基本上告诉我“给我索引的值”,我怎么能用字符搜索,我应该用索引搜索?

在kotlin中,我得到了期望(count[str.get(i)]),它期待的是int,而不是char。

我可能错过了妨碍我理解这一点的基本概念,但经过简短的谷歌搜索后,我没有找到多少。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-07 03:23:12

Java将将char转换为int,例如,根据ASCII表将'A‘转换为65

只要您的string不包含返回大于255 (例如"€")的值的字符,一个256位置数组就足以将可能的chars映射到数组位置。例如,对于英文字母表,这就足够了。然而,由于Java中的字符是2 bytes (16位),那么大小为65536 (2^16)的数组就足够安全了。还可以从该字符串上的所有字符(假设为非空字符串或空字符串)计算max int值,并相应地分配数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int count[] = new int[str.chars().max().orElse(0)+1];

回到你的问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
count[some_char]++

some_char转换为int,并在相应的数组count位置上增加一个值。

您可以将这个过程看作是一个简单的散列函数,它将' char‘映射为'int',即使它很简单,但它非常适合当前的问题,因为它唯一地将给定的字符映射到数组上的某个位置。

我正在初始化count数组以保存in,但是在for循环中搜索字符串中的特定字符,例如:

数"t“++,所以它基本上告诉我”给我索引的值“?我怎么能用字符搜索,我应该在哪里搜索索引?

请注意,count["t"]++会给您一个编译错误,函数str.charAt(i)会返回一个char,而不是String,因此不返回"t“,而不是”t“。

一个正在运行的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Arrays;
import java.util.stream.Collectors;

public class FindMaximumOccurringChar {

    private static int[] countChar(String str) {
        int[] count = new int[str.chars().max().orElse(0) + 1];
        for (int i = 0; i< str.length(); i++)
            count[str.charAt(i)]++;
        return count;
    }

    public static void main(String[] args) {
        String str = "miaumiauuuuu";
        int[] count = countChar(str);
        String str_without_duplicated_char = Arrays.stream(str.split(""))
                .distinct()
                .collect(Collectors.joining());

        for (int i=0; i<str_without_duplicated_char.length(); i++){
            System.out.println("The char '"+str_without_duplicated_char.charAt(i)+"' shows up "
                    + count[str_without_duplicated_char.charAt(i)] +" times");
        }
    }
}

产出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
The char 'm' shows up 2 times
The char 'i' shows up 2 times
The char 'a' shows up 2 times
The char 'u' shows up 6 times
票数 4
EN

Stack Overflow用户

发布于 2020-12-07 03:25:10

基本上,count[str.charAt(i)]++,存储输入字符串的每个字符的计数。Java将每个字符索引转换为ASCII值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let say str = "abca";

For each iteration : 
count['a'] = 1; or count[97] = 1;  a has ascii value 97
count['b'] = 1; or count[98] = 1;  b has ascii value 98
count['c'] = 1; or count[99] = 1;  c has ascii value 99
count['a'] = 2; or count[97] = 2;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65180480

复制
相关文章
字符串查找----查找算法的选择
首先来对比一下通用的查找算法和字符串查找算法: 各种字符串查找算法的性能特点 算法(数据结构) 优点 二叉查找树(BST) 适用于随机排列的键 2-3树查找(红黑树) 有性能保证 线性探测法(并行数组) 内置类型,缓存散列值 R向单词查找树 适用于较短键和较小的字母表 三向单词查找树 适用于非随机的键 如果空间足够,R向单词查找树的速度是最快的,能够在常数次次数比较内完成查找。对于大型字母表,R向单词查找树所需空间可能无法满足时,三向单词查找树是最佳选择,因为它对字符比较次数是对数级别的,而二叉查找树中键
SuperHeroes
2018/05/30
3.1K0
查找字符串中出现最多的字符
HTML5学堂:正则、数组、字符串,是JavaScript语言中让人头痛的一些知识,今天这篇文章我们使用数组字符串的方法,来实现从一个字符串中,查找出现最多的字符。 查找字符串中出现最多的字符 将一个字符串中,出现次数最多的数字提取出来,最后输出出现最多的字符是什么,出现的次数是多少。 题目剖析 字符串方法的解题思路:从最初开始进行字符的截取,获取到第一个字符之后,根据这个字符进行字符串的拆分,此时,拆分后的数组中就没有这个字符了。再将数组组合成字符串之后,原来的长度与当前字符串的长度做差值,就能够获取到当
HTML5学堂
2018/03/12
1.8K0
【字符串】字符串查找 ( 蛮力算法 )
算法题目链接 : https://www.lintcode.com/problem/13/
韩曙亮
2023/03/29
2.8K0
【字符串】字符串查找 ( 蛮力算法 )
【算法】查找字符串的 KMP 算法
相对于那些要对树、图进行操作的算法,这个算法要处理的是一维线性的字符序列。看起来似乎简单不少,那么算法难度会更低吗?让我们来看看。
叶锦鲤
2021/05/17
1.2K0
【算法】查找字符串的 KMP 算法
算法字符串匹配(查找)-BF算法
字符串是数据结构中比较简单的一种,但又是我们最常用的数据结构之一。对于字符串对象,最重要的操作之一便是字符串匹配(查找),本篇文章便向大家介绍一个典型的匹配算法—BF算法
算法与编程之美
2019/07/17
1.7K0
算法字符串匹配(查找)-BF算法
字符串中字符出现重复字符
下面是总结的一些常见问题,以供大家参考 第一次出现重复字符 出现的重复字符 出现字符串、字符还有次数 出现次数最多的字符及次数 class Eclass{ public static void main(String[] args) { String str = "eeeejwurihewweafa"; Eclass e = new Eclass(); //问题一 int index = e.Method(str); S
崔笑颜
2020/06/08
1.7K0
字符串中查找子串_cstring查找子字符串
假设要从主串 s = “goodgoogle” 中找到 t = “google” 子串。根据我们的思考逻辑,则有:
全栈程序员站长
2022/09/24
3K0
字符串中查找子串_cstring查找子字符串
【字符串】字符串查找 ( Rabin-Karp 算法 )
算法题目链接 : https://www.lintcode.com/problem/13/
韩曙亮
2023/03/29
1.2K0
1176: 查找最大字符串(指针专题)
从键盘上输入多个字符串(每个串不超过5个字符且没有空格),用”*****”作为串输入结束的标记。从所输入的若干字符串中,找出一个最大的串,并输出该串。要求最大串的查找通过调用编写的函数实现 void find(char *name[], int n, int *p) { //在包含n个字符串的二维字符数组name中,查找值最大的字符串,将其下标存入指针p所指内存单元 }
怠惰的未禾
2023/04/27
3070
KMP子字符串查找算法
KMP子字符串查找算法 概述 算法的基本思想是:当出现不匹配时,就能知晓一部分文本的内容,可以利用这些信息避免将指针回退到所有这些已知的字符串之前。 DFA(确定有限状态机)模拟 提前判断如何重新查找,而这种判断只取决于模式本身,所以可以对模式的字符序列做一个确定有限状态机。 DFA的数据结构表示为二维数组dfa[R][M],其中R为指定字典中的字符集的个数(比如ASCII为256),M为匹配字符串pat的长度,状态的意思是文本中某个位置i匹配pat的程度,0状态为未匹配状态,M状态为终止状态,找到了完整匹
felix
2018/06/08
1.4K0
子字符串查找----KMP算法
Kunth-Morris-Pratt算法的基本思想是:当出现不匹配时,就能知晓一部分内容(因为匹配失败之前的字符已经和模式相匹配)。可以利用这些信息避免指针回退。令人惊讶的是,KMP算法在匹配失败时,总能将j设置为一个值以使i不回退。 在KMP算法中,不会回退文本指针i,而是用一个数组dfa[][]来记录匹配失败时指针j应该回退多远。对于每一个字符c,在比较了c和pat.charAt(j)后,dfa[c][j]表示的是应该和下一个文本字符比较的模式字符的位置。在匹配时会继续比较下一个字符,因此dfa[pat
SuperHeroes
2018/05/30
1.1K0
JS求字符串中连续字符出现最长的字符串
最长的字母序连续子字符串的长度 字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "abcdefghijklmnopqrstuvwxyz" 的任意子字符串都是 字母序连续字符串 。
剁椒鱼鳞
2023/05/23
1.3K0
JS求字符串中连续字符出现最长的字符串
Java在字符串中查找匹配的子字符串
示例: 在源字符串“You may be out of my sight, but never out of my mind.”中查找“my”的个数。输出:匹配个数为2
全栈程序员站长
2022/09/14
7.2K0
统计字符串中字符出现的次数-Python
方法一: list1 = ['a', 'a', 'b', 'c', 'c', 'c', 'c'] dict_cnt = {} for value in list1: dict_cnt[value] = dict_cnt.get(value, 0) + 1 print(dict_cnt) 方法二: list1 = ['a', 'a', 'b', 'c', 'c', 'c', 'c'] dict_cnt = {} for item in list1: if item in dict_cnt:
流柯
2020/08/03
2.6K0
子字符串查找----各种算法总结
优点: 暴力查找算法:实现简单且在一般情况下工作良好(Java的String类型的indexOf()方法就是采用暴力子字符串查找算法); Knuth-Morris-Pratt算法能够保证线性级别的性能且不需要在正文中回退; Boyer-Moore算法的性能一般情况下都是亚线性级别; Rabin-Karp算法是线性级别; 缺点: 暴力查找算法所需时间可能和NM成正比; Knuth-Morris-Pratt算法和Boyer-Moore算法需要额外的内存空间; Rabin-Karp算法内循环很长(若干次算术运算,
SuperHeroes
2018/05/30
1K0
sqlserver 查找某个字符在字符串中第N次出现的位置
例如: 查找'A,' 在'A,B,C,D,A,B,C,D,C,D,B,A,C,E,'中第二次出现的位置 怎么实现,SQL 中有这样的函数吗?
跟着阿笨一起玩NET
2018/09/18
6.7K0
字符串匹配:字符串中查找某子串
我们在平时的软件开发,尤其是嵌入式开发,字符串匹配是非常重要的一个算法。而目前常用的字符串匹配算法有很多,下面就来介绍几个。
跋扈洋
2022/03/29
1.4K0
统计字符串中字符出现次数(延伸)
说明:第一个参数表示被统计的字符串,第二个参数是需要统计的字符。 思想,定义一个对象保存比较的结果。
从入门到进错门
2018/08/21
1.2K0
Python查找任意字符串中只出现一次的字符(2016奇虎笔试题)
''' 程序功能: 编写函数,给定任意字符串,找出其中只出现一次的字符, 如果有多个这样的字符,就全部找出。''' import sys def searchOne(s): # 创建空字典 d = dict() # 遍历字符串,并分别记录每个字符的出现次数 for ch in s: # 这里重点演示字典的get()方法 # 如果这个字符出现过,加1 # 如果这个字符第一次出现,0+1 d[ch] = d.get(ch, 0)
Python小屋屋主
2018/04/17
6.1K0
Python查找任意字符串中只出现一次的字符(2016奇虎笔试题)
Java中的字符串的最大长度
看String的源码可以看出来,String实际存储数据的是char value[],数组的长度是int类型,
用户8554325
2023/03/10
3.8K0
Java中的字符串的最大长度

相似问题

理解这个算法来查找字符串的排列(递归)

57

理解同构字符串算法

47

查找子串在字符串中连续出现的最大次数

456

查找javascript中数组中字符串元素的最大出现量

16

字符串出现计数算法

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文