【入门篇】确定字符串是否包含唯一字符——多语言版本

news2024/11/25 21:28:26

题目跳转:确定字符串是否包含唯一字符
在这里插入图片描述

题目解析

这个问题要求我们判断一个字符串中的字符是否唯一(忽略字母的大小写),并输出相应的结果。如果字符串中所有的字符都是唯一的,输出 YES;否则,输出 NO。我们可以通过不同的编程语言实现这个算法。下面给出 Python、C、C++ 和 Java 的实现及其思路。

  • 忽略字母大小写:我们首先需要将字符串转换为统一的大小写(例如全转换为小写或大写),以忽略字母的大小写差异。

  • 判断字符是否唯一:遍历字符串中的每个字符,并使用一个集合(set)来存储已经遇到的字符。每当遇到一个字符时,检查它是否已经存在于集合中。如果存在,说明字符串中有重复字符,输出NO。否则,将该字符加入集合继续检查。

  • 时间复杂度:遍历字符串一次,集合操作(加入元素和查找元素)平均时间复杂度为 O(1),因此总时间复杂度为 O(n),其中 n 是字符串的长度。

  • 输入格式:输入一行字符串,长度不超过 100 个字符。

  • 输出格式:输出一行,若字符串中的字符是唯一的,则输出 “YES”;否则输出 “NO”。

  • 特殊要求:字符的比较是忽略大小写的,这意味着 ‘a’ 和 ‘A’ 被视为相同的字符。

示例分析

  • 输入: abd25+

    • 解析:该字符串中的字符分别是 ‘a’, ‘b’, ‘d’, ‘2’, ‘5’, ‘+’。每个字符都是唯一的。
    • 输出:YES
  • 输入: copy

    • 解析:该字符串中的字符是 ‘c’, ‘o’, ‘p’, ‘y’。 ‘o’ 在字符串中出现了两次,所以不是唯一的。
    • 输出:NO

实现思路

为了解决这个问题,可以使用集合(set)来存储已经遇到的字符。集合具有查找和插入操作的平均时间复杂度为 O(1),这使得我们能够高效地检查字符是否已经存在。

具体步骤

  1. 初始化集合:创建一个空的集合来存储字符。
  2. 遍历字符串
    • 将每个字符转换为小写以忽略大小写。
    • 检查该字符是否已经在集合中:
      • 如果在,说明字符重复,直接返回 “NO”。
      • 如果不在,将字符加入集合。
  3. 结束遍历:如果遍历结束后没有发现重复字符,返回 “YES”。

代码示例~

下面给出 Python、C、C++ 和 Java 的实现及其思路和注释。

思路:

  1. 忽略字母大小写:我们首先需要将字符串转换为统一的大小写(例如全转换为小写或大写),以忽略字母的大小写差异。
  2. 判断字符是否唯一:遍历字符串中的每个字符,并使用一个集合(set)来存储已经遇到的字符。每当遇到一个字符时,检查它是否已经存在于集合中。如果存在,说明字符串中有重复字符,输出 NO。否则,将该字符加入集合继续检查。
  3. 时间复杂度:遍历字符串一次,集合操作(加入元素和查找元素)平均时间复杂度为 O(1),因此总时间复杂度为 O(n),其中 n 是字符串的长度。

Python 实现:

def is_unique(s):
    s = s.lower()  # 将字符串转为小写,忽略大小写
    seen = set()    # 用集合来记录已出现的字符
    for char in s:
        if char in seen:  # 如果字符已经出现过,说明有重复
            return "NO"
        seen.add(char)  # 否则加入集合
    return "YES"

# 输入字符串
s = input().strip()
print(is_unique(s))

在这里插入图片描述

C 实现:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int is_unique(const char *str) {
    int seen[256] = {0};  // 用一个数组记录字符是否出现过,ASCII码范围 0-255
    for (int i = 0; str[i] != '\0'; i++) {
        char c = tolower(str[i]);  // 转换为小写
        if (seen[c] > 0) {  // 如果字符已经出现过
            return 0;  // 返回 0,表示有重复
        }
        seen[c] = 1;  // 标记该字符出现过
    }
    return 1;  // 没有重复,返回 1
}

int main(int argc, char *argv[])
{
  char str[101];
    fgets(str, 101, stdin);  // 读取输入字符串
    // 去除末尾的换行符
    str[strcspn(str, "\n")] = 0;
    
    if (is_unique(str)) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }
    return 0;
}

在这里插入图片描述

C++ 实现:

#include <iostream>
#include <unordered_set>
#include <cctype>
using namespace std;

string is_unique(const string &s) {
    unordered_set<char> seen;  // 使用 unordered_set 存储已出现的字符
    for (char c : s) {
        c = tolower(c);  // 转换为小写
        if (seen.count(c) > 0) {  // 如果字符已经出现过
            return "NO";
        }
        seen.insert(c);  // 插入集合
    }
    return "YES";  // 没有重复字符
}

int main() {
    string str;
    getline(cin, str);  // 读取整行输入
    cout << is_unique(str) << endl;
    return 0;
}

在这里插入图片描述

Java 实现:

import java.util.Scanner;
import java.util.HashSet;

public class Main {
    public static String isUnique(String s) {
        s = s.toLowerCase();  // 转换为小写
        HashSet<Character> seen = new HashSet<>();  // 使用 HashSet 来记录字符
        for (char c : s.toCharArray()) {
            if (seen.contains(c)) {  // 如果字符已经出现过
                return "NO";
            }
            seen.add(c);  // 将字符加入集合
        }
        return "YES";  // 所有字符唯一
    }

    public static void main(String[] args) {
        java.util.Scanner scanner = new java.util.Scanner(System.in);
        String str = scanner.nextLine();  // 读取输入
        System.out.println(isUnique(str));
    }
}

在这里插入图片描述

总结:

  1. 忽略大小写:在所有实现中,都通过将字符串转换为统一的大小写来忽略字母的大小写差异。
  2. 使用集合/数组:通过集合(Python、C++、Java)或数组(C)来记录已经遇到的字符。集合的特点是可以高效地检查元素是否已存在,因此使用集合是判断字符唯一性的理想选择。
  3. 时间复杂度:所有的实现都通过一次遍历字符串来完成,时间复杂度为 O(n),空间复杂度主要由集合或数组的大小决定,最坏情况是 O(256),即 ASCII 字符的总数。

如果你在写这题还有思路上的疑问,或者代码上遇到问题,qq上私聊我,或者直接将代码和报错截图放在留言区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ConcurrentModificationException:检测到并发修改完美解决方法

&#x1f6a6; ConcurrentModificationException&#xff1a;检测到并发修改完美解决方法 &#x1f4a1; &#x1f6a6; ConcurrentModificationException&#xff1a;检测到并发修改完美解决方法 &#x1f4a1;摘要1. 什么是ConcurrentModificationException&#xff1f;&…

并查集 How many tables(hdu 1213) How many answers are wrong(hdu 3038)

目录 前言 并查集 并查集的初始化 并查集的合并 并查集合并的优化&#xff0c;路径压缩 How many tables(hdu 1213) 问题描述 输入 输出 问题分析 代码 带权并查集 How many answers are wrong(hdu 3038) 问题描述 输入 输出 问题分析 代码 前言 感觉并查集总共有两个应…

JavaScript day01 笔记

一、引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中 1️⃣内部 通过 script 标签包裹 JavaScript 代码&#xff08;一般就写在</script>的…

Notepad++ 最新官网中文版在线下载 附文本编辑器安装与基础使用教程

Notepad &#xff08;记事本&#xff09;是一个简单的文本编辑器&#xff0c;预装在所有版本的 Microsoft Windows 操作系统中。它的主要功能是创建、编辑和存储纯文本文件&#xff0c;通常以 .txt 格式保存。Notepad 的设计旨在提供一个轻量级的文本处理工具&#xff0c;适合快…

使用C语言进行信号处理:从理论到实践的全面指南

1. 引言 在现代操作系统中&#xff0c;信号是一种进程间通信机制&#xff0c;它允许操作系统或其他进程向一个进程发送消息。信号可以用来通知进程发生了一些重要事件&#xff0c;如用户请求终止进程、硬件异常、定时器超时等。掌握信号处理技术对于开发健壮、高效的系统程序至…

大数据入门-什么是HBase

目录 一、概念 二、架构 1.Client 2.Zookeeper 3.HMaster 4.HRegionServer 三、特性 1.数据存储庞大 2.支持随机读写 3.轻松融入生态 4.数据强一致性 5.性能足够高效 四、适用场景 五、其他事宜 1.权益备注 2.支持博主 大数据入门系列文章 这里简单介绍的HBas…

【笔记】自动驾驶预测与决策规划_Part6_不确定性感知的决策过程

文章目录 0. 前言1. 部分观测的马尔可夫决策过程1.1 POMDP的思想以及与MDP的联系1.1.1 MDP的过程回顾1.1.2 POMDP定义1.1.3 与MDP的联系及区别POMDP 视角MDP 视角决策次数对最优解的影响 1.2 POMDP的3种常规解法1.2.1 连续状态的“Belief MDP”方法1. 信念状态的定义2. Belief …

Vue2中使用firefox的pdfjs进行文件文件流预览

文章目录 1.使用场景2. 使用方式1. npm 包下载,[点击查看](https://www.npmjs.com/package/pdfjs-dist)2. 官网下载1. 放到public文件夹下面2. 官网下载地址[点我,进入官网](https://github.com/mozilla/pdf.js/tags?afterv3.3.122) 3. 代码演示4. 图片预览5. 如果遇到跨域或者…

MFC图形函数学习06——画椭圆弧线函数

绘制椭圆弧线函数是MFC基本绘图函数&#xff0c;这个函数需要的参数比较多&#xff0c;共四对坐标点。前两对坐标点确定椭圆的位置与大小&#xff0c;后两对坐标确定椭圆弧线的起点与终点。 一、绘制椭圆弧线函数 原型&#xff1a;BOOL Arc(int x1,int y1,int x2,int y2…

新版 idea 编写 idea 插件时,启动出现 ClassNotFound

IntelliJ IDEA 2024.1.6 (Ultimate Edition) Build #IU-241.19072.14, built on August 8, 2024 Licensed to Sophia Tout Subscription is active until June 29, 2025. For educational use only. Runtime version: 17.0.111-b1207.30 amd64 Kotlin: 241.19072.14-IJ 新版本…

信息安全工程师(83)Windows操作系统安全分析与防护

一、Windows操作系统安全分析 系统漏洞&#xff1a; Windows操作系统由于其复杂性和广泛使用&#xff0c;可能存在一些已知或未知的漏洞。这些漏洞可能会被黑客利用&#xff0c;进行恶意攻击。微软会定期发布系统更新和补丁&#xff0c;以修复这些漏洞&#xff0c;提高系统的安…

【嵌入式开发——ARM】1ARM架构

嵌入式领域&#xff0c;使用ARM架构的芯片公司可不占少数吧&#xff0c;intel的x86架构主要占据PC、服务器市场&#xff0c;ARM架构主要占据移动市场。x86架构和ARM架构不同的主要原因&#xff0c;是背后使用的计算机指令集不同。计算机有自己的语言系统&#xff08;汇编&#…

31-自定义地图:分层地图

利用自定义地图中的级别&#xff0c;可以让多个人同时在一张地图上工作。它还允许您在仿真过程中使用Python API在地图上加载和卸载层&#xff0c;就像分层的CARLA地图一样(layered CARLA maps)。 本指南将解释如何添加新级别&#xff0c;如何向级别添加资产&#xff0c;以…

操作系统-磁盘

文章目录 磁盘的结构一、磁盘的物理结构二、磁盘的逻辑结构 磁盘的调度算法磁盘时间算法先来先服务&#xff08;FCFS - First-Come, First-Served&#xff09;最短寻道时间优先&#xff08;SSTF - Shortest Seek Time First&#xff09;扫描算法&#xff08;SCAN&#xff0c;也…

【Linux】【信号操作】汇总整理

信号&#xff08;Signals&#xff09;是操作系统中用于通知进程发生特定事件的一种机制。信号可以由软件或硬件触发&#xff0c;并且可以被进程捕获和处理。以下是信号的相关概念、常见信号列表、信号处理以及相关API的汇总整理。 信号概述 信号是操作系统向进程发出的通知&am…

必备的计算机软件专业资料汇总,包括:计算机专业实习报告,计算机毕业设计成品(含源码和论文1900套)

大学期间必备的计算机软件专业资料汇总&#xff0c;包括&#xff1a;计算机专业实习报告&#xff08;58篇&#xff09;、计算机毕业设计成品&#xff08;含源码和论文&#xff0c;1900多套&#xff0c;包括C语言/PHP/VB/java/JSP/Andorid/Python/微信小程序等&#xff09;、HTM…

业务模块部署

一、部署前端 1.1 window部署 下载业务模块前端包。 &#xff08;此包为耐威迪公司发布&#xff0c;请联系耐威迪客服或售后获得&#xff09; 包名为&#xff1a;业务-xxxx-business &#xff08;注&#xff1a;xxxx为发布版本号&#xff09; 此文件部署位置为&#xff1a;……

使用kalibr_calibration标定相机(realsense)和imu(h7min)

vslam-evaluation/VINS/Installation documentation/4.IMU和相机联合标定kalibr_calibration.md at master DroidAITech/vslam-evaluation GitHub 目录 1.kalibr安装 1.1安装依赖项 1.2创建工作空间 1.3下载kalibr并编译 1.4设置环境变量 2.准备标定板 3.配置驱动和打…

Java | Leetcode Java题解之第551题学生出勤记录I

题目&#xff1a; 题解&#xff1a; class Solution {public boolean checkRecord(String s) {int absents 0, lates 0;int n s.length();for (int i 0; i < n; i) {char c s.charAt(i);if (c A) {absents;if (absents > 2) {return false;}}if (c L) {lates;if …

MATLAB课程:AI工具辅助编程——MATLAB+LLMs

给出一些可能有用的方法辅助大家写代码。 方法一&#xff1a;MATLAB软件LLM (不太懂配置的同学们为了省事可以主要用这个方法) 方法一特别针对本门MATLAB教学课程&#xff0c;给出一种辅助ai工具的操作指南。MATLAB中可以安装MatGPT插件&#xff0c;该插件通过调用ChatGPT的API…