BackmediumHashinguncategorizedmedium

Generate Unique Book Identifiers Solution

Problem Statement

You are tasked with implementing a cataloging system for a digital library. Each book is represented by a tuple containing its publication year (integer), author name (string), and title (string). The system requires a unique identifier for each book, constructed by concatenating these three attributes in the specific format: {year}-{author}-{title}.

Given a list of existing identifiers in the system and a new book's attributes, determine if the generated identifier for the new book is already present in the existing collection. If the identifier exists, the book is considered a duplicate; otherwise, it is unique.

Your function should accept the list of existing identifiers and the attributes of the new book (year, author, title) as inputs. It should return a boolean value: true if the generated identifier is found in the existing list, and false otherwise. Ensure that the comparison is case-sensitive and exact.

Example 1
Input
existing = ["2020-Asimov-Foundation", "2019-Tolkien-LordOfTheRings"], year = 2020, author = "Asimov", title = "Foundation"
Output
true

Explanation: 1. Construct the identifier for the new book: `2020-Asimov-Foundation`. 2. Check if `2020-Asimov-Foundation` exists in the `existing` list. 3. The first element in `existing` is `2020-Asimov-Foundation`, which matches exactly. 4. Return `true`.

Example 2
Input
existing = ["2021-King-It", "2018-Paul-Neuromancer"], year = 2021, author = "King", title = "It"
Output
true

Explanation: 1. Construct the identifier: `2021-King-It`. 2. Search for `2021-King-It` in the `existing` list. 3. The first element matches `2021-King-It`. 4. Return `true`.

Example 3
Input
existing = ["2022-Clarke-2001", "2015-Bradbury-Fahrenheit451"], year = 2022, author = "Clarke", title = "2001"
Output
true

Explanation: 1. Construct the identifier: `2022-Clarke-2001`. 2. Search for `2022-Clarke-2001` in the `existing` list. 3. The first element matches `2022-Clarke-2001`. 4. Return `true`.

Example 4
Input
existing = ["2020-Asimov-Foundation", "2019-Tolkien-LordOfTheRings"], year = 2020, author = "Asimov", title = "Foundation2"
Output
false

Explanation: 1. Construct the identifier: `2020-Asimov-Foundation2`. 2. Search for `2020-Asimov-Foundation2` in the `existing` list. 3. The first element is `2020-Asimov-Foundation`, which does not match because the title differs. 4. The second element is `2019-Tolkien-LordOfTheRings`, which also does not match. 5. Return `false`.

Example 5
Input
existing = ["2021-King-It", "2018-Paul-Neuromancer"], year = 2021, author = "King", title = "IT"
Output
false

Explanation: 1. Construct the identifier: `2021-King-IT`. 2. Search for `2021-King-IT` in the `existing` list. 3. The first element is `2021-King-It`. Since the comparison is case-sensitive, `IT` does not match `It`. 4. The second element is `2018-Paul-Neuromancer`, which does not match. 5. Return `false`.

Constraints

  • 1 <= existing.length <= 10^5
  • 1 <= year <= 2100
  • 1 <= author.length <= 50
  • 1 <= title.length <= 100
  • author and title consist of alphanumeric characters and underscores only
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Generate Unique Book Identifiers — Problem Statement & Solution Guide

HashingMediumMixed
TimeO(N + M)
|
SpaceO(N + M)

Problem Description

You are tasked with implementing a cataloging system for a digital library. Each book is represented by a tuple containing its publication year (integer), author name (string), and title (string). The system requires a unique identifier for each book, constructed by concatenating these three attributes in the specific format: {year}-{author}-{title}.

Given a list of existing identifiers in the system and a new book's attributes, determine if the generated identifier for the new book is already present in the existing collection. If the identifier exists, the book is considered a duplicate; otherwise, it is unique.

Your function should accept the list of existing identifiers and the attributes of the new book (year, author, title) as inputs. It should return a boolean value: true if the generated identifier is found in the existing list, and false otherwise. Ensure that the comparison is case-sensitive and exact.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Generate Unique Book Identifiers"

medium

WHY DOES IT MATTER?

Hash‑set based deduplication is a fundamental pattern for any system that must enforce uniqueness at scale, from user IDs to transaction hashes. Mastering it prevents hidden O(N^2) pitfalls that can cripple performance under real‑world loads.

OPTIMIZATION CHALLENGE

The key insight is to decouple string construction from existence checking: build the identifier once, then rely on a constant‑time hash lookup instead of scanning the entire list. This transforms a potentially quadratic algorithm into a linear one.

REAL-WORLD CONNECTION

Think of a distributed key‑value store like DynamoDB where each item key must be unique across partitions. The store uses a hash of the key to route and quickly verify uniqueness, mirroring the hash‑set lookup we perform for book identifiers.

During an interview, write the formatter first, then immediately declare a hash set for existing IDs. Show that you understand average‑case O(1) lookups and discuss edge cases (delimiter collisions, batch duplicates) to demonstrate depth.

COMPLEXITY AT A GLANCE

⏱ Time:O(N + M)
💾 Space:O(N + M)

Core Theory — Why This Approach?

The core of this problem lies in efficient string construction combined with constant‑time membership testing. A naive solution would iterate over the list of existing identifiers for each new book, resulting in O(N) time per query and O(N^2) overall for M queries, which quickly becomes prohibitive as the catalog grows into the millions. By leveraging a hash‑based set (or unordered_set in C++, HashSet in Java, dict in Python) we can store every pre‑computed identifier once and then answer existence checks in average O(1) time. The algorithm therefore follows the classic "hash‑set lookup" paradigm: transform the tuple into its canonical string representation, query the set, and insert the new identifier if it is unique. This approach reduces the overall time complexity from quadratic to linear while keeping auxiliary space linear in the number of books.

The optimal paradigm also highlights the importance of deterministic string formatting. Concatenating the three fields with a delimiter that cannot appear in the raw data (e.g., a hyphen) guarantees a bijective mapping between the tuple and its identifier, eliminating collisions that would otherwise require additional disambiguation logic. When the delimiter could be part of an author name or title, escaping or using a non‑printable separator becomes necessary, but the underlying hash‑set strategy remains unchanged.

Interview Questions on This Problem

Q1How would you design a system to generate a unique book identifier in O(1) time per insertion when the catalog contains up to 10^7 entries?

Store all existing identifiers in a hash set. For each new book, format the identifier as "year-author-title" and check the set; if it exists, append a numeric suffix until a free slot is found (still O(1) amortized). Insert the final identifier into the set. This gives constant‑time average insertion and lookup.

Q2What issues arise if the delimiter used in the identifier (e.g., '-') can appear in author names or titles, and how would you resolve them?

If the delimiter appears in raw fields, two different tuples could map to the same string, causing false collisions. Resolve by either escaping the delimiter inside fields (e.g., replace '-' with '--') or by using a character guaranteed not to appear (such as a null byte or a Unicode control character) before concatenation.

Q3Explain how you would extend this solution to support batch insertion of 10^5 new books while maintaining O(N) total time.

Pre‑process the batch by generating identifiers for each tuple, checking against the existing hash set and a temporary batch set to catch intra‑batch duplicates. Insert all unique identifiers into the main set after the batch scan. This ensures each identifier is processed a constant number of times, yielding linear total time.

Examples

Example 1

Input

existing = ["2020-Asimov-Foundation", "2019-Tolkien-LordOfTheRings"], year = 2020, author = "Asimov", title = "Foundation"

Output

true

Explanation: 1. Construct the identifier for the new book: `2020-Asimov-Foundation`. 2. Check if `2020-Asimov-Foundation` exists in the `existing` list. 3. The first element in `existing` is `2020-Asimov-Foundation`, which matches exactly. 4. Return `true`.

Example 2

Input

existing = ["2021-King-It", "2018-Paul-Neuromancer"], year = 2021, author = "King", title = "It"

Output

true

Explanation: 1. Construct the identifier: `2021-King-It`. 2. Search for `2021-King-It` in the `existing` list. 3. The first element matches `2021-King-It`. 4. Return `true`.

Example 3

Input

existing = ["2022-Clarke-2001", "2015-Bradbury-Fahrenheit451"], year = 2022, author = "Clarke", title = "2001"

Output

true

Explanation: 1. Construct the identifier: `2022-Clarke-2001`. 2. Search for `2022-Clarke-2001` in the `existing` list. 3. The first element matches `2022-Clarke-2001`. 4. Return `true`.

Example 4

Input

existing = ["2020-Asimov-Foundation", "2019-Tolkien-LordOfTheRings"], year = 2020, author = "Asimov", title = "Foundation2"

Output

false

Explanation: 1. Construct the identifier: `2020-Asimov-Foundation2`. 2. Search for `2020-Asimov-Foundation2` in the `existing` list. 3. The first element is `2020-Asimov-Foundation`, which does not match because the title differs. 4. The second element is `2019-Tolkien-LordOfTheRings`, which also does not match. 5. Return `false`.

Example 5

Input

existing = ["2021-King-It", "2018-Paul-Neuromancer"], year = 2021, author = "King", title = "IT"

Output

false

Explanation: 1. Construct the identifier: `2021-King-IT`. 2. Search for `2021-King-IT` in the `existing` list. 3. The first element is `2021-King-It`. Since the comparison is case-sensitive, `IT` does not match `It`. 4. The second element is `2018-Paul-Neuromancer`, which does not match. 5. Return `false`.

Constraints

  • 1 <= existing.length <= 10^5
  • 1 <= year <= 2100
  • 1 <= author.length <= 50
  • 1 <= title.length <= 100
  • author and title consist of alphanumeric characters and underscores only

Optimal Approach & Strategy

Insert all existing identifiers into a hash set and perform O(1) average‑time lookups for each new identifier.

Brute Force Approach

Iterate through the entire list of existing identifiers for each new book to see if the generated string already exists.

Verified Code Solutions

JavaScript Solution
Time: O(N + M)
function generateBookId(book) { return `${book.year}-${book.author}-${book.title}`; }

Asked in Top Tech Interviews

uncategorizedmediumgeneric

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.